[Rails 4.x] FormのSelect プルダウンメニューの項目をDBから引っ張ってくる方法

More than 1 year has passed since last update.

前置き

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