LoginSignup
296

More than 5 years have passed since last update.

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

Posted at

前置き

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
296