Help us understand the problem. What is going on with this article?

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

More than 5 years have 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
Why do not you register as a user and use Qiita more conveniently?
  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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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