【form_for】初めてのselectボックス実装


hamlでのform_for のselectタグ実装方法についてです。

ビューのイメージ

collection_selectselectか?

  • DBから取得 → f.collection_select タグ
  • 自分で配列を定義した場合など → f.select タグ

基本の構成

haml
= f.collection_select :カラム名(プロパティ名), 選択肢の配列, :value属性, :選択肢の表示, {オプション}, {HTMLオプション}
= f.select :カラム名(プロパティ名), 選択肢の配列, {オプション}, {HTMLオプション}
//選択肢を場合に応じて、変更・指定したい時
= f.select :カラム名(プロパティ名), options_for_select(選択肢の配列.map{|c|[表示する値, valueにする値, {追加属性}]}, 初期値のvalueを指定), {オプション}, {HTMLオプション}
= f.select :カラム名(プロパティ名), options_for_select(選択肢の配列.map{|c| [c[:表示したい値], c[valueにしたい値]]}), {オプション}, {HTMLオプション}

mapメソッド:要素の数だけ繰り返し、配列を作成する。戻り値がない時は、配列にnilが入る。

  • カラム名(プロパティ名):コントローラで、どんな名前として値を受け取りたいか?
    (例)params[:form_withで指定したモデル名][:カラム名]
  • 選択肢の配列:選択肢の表示に使うデータ(optionタグに設定されるデータ) ※必ず配列か、ハッシュの型。
  • value属性:valueとして取得したいカラムを指定。
  • 選択肢の表示:optionタグに設定したい値のカラムを指定。
  • オプション:初期表示したい文字列の定義、デフォルトで選択したい値の指定など。
  • HTMLオプション:id名、class名など。※設定しない場合は 空のカッコ{}が必要。

初期値として、optionに定義していない文字列を表示する時の注意点

promptとinclude_blankの違い
使い回さない場合(1回っきりの使用限定) → prompt:選択してください
使い回したい場合 → include_blank:選択してください

例えば、新規登録ページの実装時に、同じビューを使って編集ページの実装を考えている場合、promptを使ってしまうと、編集ページで表示されない!!っと詰まりました。

参)実装したコード

haml
=f.collection_select :item_condition_id, ItemCondition.all, :id, :name, {include_blank: "選択してください"}, {class: "item_condition_box"}

DBからデータ取得してselectで表示する時の注意点