前置き
select_tagによる決め打ちの選択肢でなく、DBのテーブルから項目を引っ張ってきます。
例
User
|id |name |origin |
| 1|やまだ |1 |
| 2|かわだ |2 |
| 3|やまだ |3 |
belongs_to origin
Origin
|id |name |
| 1|水星 |
| 2|金星 |
| 3|地球 |
has_many users
collection_selectを使う
<%= form_for @user do |f| %>
<%= f.label :origin_id %>
<%= f.collection_select :origin_id, Origin.all, :id, :name %>
<% end %>
collection_selectの文法
<%= f.collection_select <属性名>, <プルダウンメニュー表示用の配列データ>, <valueとして扱うカラム名>, <表示用のカラム名>, <オプション> %>
selectを使う
<%= f.select :origin_id, Origin.all.map{|o| [o.name, o.id]} %>
オプション
:include_blank
- プルダウンメニューの先頭に空白行を追加する。空白行の value は空文字列が指定されます
- include_blank オプションの値を true/false ではなく文字列にすると、その文字列が使用されます。
<%= f.collection_select :origin_id, Origin.all, :id, :name, :include_blank => true %>
:prompt
- prompt オプションを使うと、プルダウンメニューが選択されていない時(=初期値が設定されなかったとき)に「選択して下さい」といった文字列の行が先頭に追加される。
<%= f.collection_select
:prefecture_id, Prefecture.all, :id, :name,
:prompt => true %>
- 表示される文字列は I18n を使っている場合、ロケ―ルファイルで指定された文字列が使用されます。
ja:
helpers:
select:
prompt: "なんにも入力されていません。"
- promptオプションの値を true/false ではなく文字列にすると、それがプロンプトとして使用されます。
<%= f.collection_select
:origin_id, Origin.all, :id, :name,
:prompt => "なんか選んでよ" %>
補足:既存の値を設定する場合
- コントローラーのnewメソッド内で指定します。
classUserController < ApplicationController
def new
@user = User.new(:origin_id => 1)
end
end