293
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

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

前置き

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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
293
Help us understand the problem. What are the problem?