やりたい事

hamlの書き方で、select_boxを使いその値をデータベースに保存したい

手順

コントローラー側で保存するカラムなどの記述

def new
    @product = Product.new 1 productテーブルの箱を準備
    @address = Prefecture.all 77 これは後で。active_hash
end

def create
    @product = Product.create(products_params) 4 2の決まりに従ってデータベースに保存
  redirect_to "/" 5 登録が完了したらホームに戻るように指示
end

private

  def products_params

    params.require(:product).permit(:condition, :limit).merge(saler_id: current_user.id) 2 productテーブルのconditionとlimitカラムに値を入れることを許可(products_paramsで使えるようにしている)

  end

ここで行ったこと

  1. 値を入れるための箱を作成(作った箱は@productとしている)
  2. productテーブルの箱の中のどのカラムにデータを入れるか決めている(今回はconditionとlimit)
  3. ビューに飛びます
  4. 2で決めたカラムに値を入れてデータベースに保存
  5. データベースに保存後、ホームへ飛ばす

注意

  • createしているアクションはビュー画面は必要ない。その代わりnewのビュー画面は必須。値を入力されるところ
  • newとcreateはセットで考えよう

viewページでform_for使った記述

 =form_for(@product, url: products_path) do |f| 1 ここで値が入った箱をコントローラーで決めた位置に飛ばす
  %h4.product_Details__item--sub
    商品の状態            
    %span.icon__logo
     必須
  ⬇️ 2 これはf.selectで形を作り、それをどのカラムに入れるのかを記述、セレクトする中身を記述
   = f.select :condition,  [['--','0'],['新品、未使用','新品、未使用'],['未使用に近い','未使用に近い'],["目立った傷やよごれなし","目立った傷やよごれなし"],["やや傷や汚れあり","やや傷や汚れあり"],["傷や汚れあり","傷や汚れあり"],["全体的に状態が悪い","全体的に状態が悪い"]] 

  %h4.delivery_box__item--sub
     発送元の地域
     %span.icon__logo
       必須
  ⬇️ 77 active_hash!後ほど
   = f.collection_select :place ,@address, :name, :name 

   %h4.delivery_box__item--sub
    発送までの日数
     %span.icon__logo
      必須  
  ⬇️ 2 これもf.selectで形を作り、それをどのカラムに入れるのかを記述、セレクトする中身を記述
   = f.select :limit,  [['--','0'],['1〜2日で発送','1〜2日で発送'],['2〜3日で発送','2〜3日で発送'],['4〜7日で発送','4〜7日で発送']]

ここで行ったこと

  1. ここで得たデータをまとめてコントローラーに飛ばして作ってもらう。変数定義した@productに飛ばしている。そのurlパスも記述
  2. セレクトボックスを作り、その選択肢を作成。またその値をどのカラムに入れて持っていくか記述

注意

  • コントローラーで指定していないカラムをview画面で設定してもデータベースには保存されない
  • コントローラー側で設定していても、テーブルの中にカラムがなかったらもちろん保存されない。

別件、active_hash!

便利さ

中身の値が変化しないデータベースとして扱うことが出来る

セレクトボックスなど中身が変化しない値にはピッタリ

手順

gemを追加

gem 'active_hash' これを追加

その後ターミナルで bundle install を実行

modelを追加

rails g model Address prefecture_id:integer city:string ターミナルで実行 
Addressテーブルを作成して、カラムも作成。その後ターミナルで

rake db:migrate データベースを作成していない場合は rake db:createを先にしてから

モデルの中身を記述(今回は都道府県)

class Prefecture < ActiveHash::Base
  self.data = [
    {id: 0, name: '--'},{id: 1, name: '北海道'}, {id: 2, name: '青森県'}, {id: 3, name: '岩手県'},
      {id: 4, name: '宮城県'}, {id: 5, name: '秋田県'}, {id: 6, name: '山形県'},
      {id: 7, name: '福島県'}, {id: 8, name: '茨城県'}, {id: 9, name: '栃木県'},
      {id: 10, name: '群馬県'}, {id: 11, name: '埼玉県'}, {id: 12, name: '千葉県'},
      {id: 13, name: '東京都'}, {id: 14, name: '神奈川県'}, {id: 15, name: '新潟県'},
      {id: 16, name: '富山県'}, {id: 17, name: '石川県'}, {id: 18, name: '福井県'},
      {id: 19, name: '山梨県'}, {id: 20, name: '長野県'}, {id: 21, name: '岐阜県'},
      {id: 22, name: '静岡県'}, {id: 23, name: '愛知県'}, {id: 24, name: '三重県'},
      {id: 25, name: '滋賀県'}, {id: 26, name: '京都府'}, {id: 27, name: '大阪府'},
      {id: 28, name: '兵庫県'}, {id: 29, name: '奈良県'}, {id: 30, name: '和歌山県'},
      {id: 31, name: '鳥取県'}, {id: 32, name: '島根県'}, {id: 33, name: '岡山県'},
      {id: 34, name: '広島県'}, {id: 35, name: '山口県'}, {id: 36, name: '徳島県'},
      {id: 37, name: '香川県'}, {id: 38, name: '愛媛県'}, {id: 39, name: '高知県'},
      {id: 40, name: '福岡県'}, {id: 41, name: '佐賀県'}, {id: 42, name: '長崎県'},
      {id: 43, name: '熊本県'}, {id: 44, name: '大分県'}, {id: 45, name: '宮崎県'},
      {id: 46, name: '鹿児島県'}, {id: 47, name: '沖縄県'}
  ]
end

これで実際にデータベースに入っているものと同じ時扱いができる。

viewページに記述(モデルで作成したものを呼ぶ)

コントローラーで準備

def new
    @address = Prefecture.all さっき作ったモデルの中身を変数定義している
  end
  • newアクションでさっき作ったモデルを使用できる記述
  • @addressに変数定義している

ビューで反映

          .form-group
            %p.name-confirm 都道府県 
            %span.form 任意
          .name-box-name-box
            %select.name-address-input
              - @address.each do |address| コントローラーで用意した@addressをaddressで使えるようにeachで回している
                %option{:value=> ""} セレクトボックス1つ1つの形
                  = address.name 都道府県の名前を表示させている
            = fa_icon "chevron-down", class: "chevron-down-address-select2"
  • コントローラーで変数定義した@addressをeachを使いaddressで使えるようにしている
  • address.nameで都道府県を表示している。

こんな感じでactive_hashを使えば簡単に大量に中身があるセレクトボックスも使えるようになる!