やりたい事
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
ここで行ったこと
- 値を入れるための箱を作成(作った箱は@productとしている)
- productテーブルの箱の中のどのカラムにデータを入れるか決めている(今回はconditionとlimit)
- ビューに飛びます
- 2で決めたカラムに値を入れてデータベースに保存
- データベースに保存後、ホームへ飛ばす
注意
- 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日で発送']]
ここで行ったこと
- ここで得たデータをまとめてコントローラーに飛ばして作ってもらう。変数定義した@productに飛ばしている。そのurlパスも記述
- セレクトボックスを作り、その選択肢を作成。またその値をどのカラムに入れて持っていくか記述
注意
- コントローラーで指定していないカラムを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で都道府県を表示している。