- Published on
RailsのSelectフォームで入力を必須(required)にする方法
railsのselect formで入力を必須(required)にする方法を紹介します。 selectと他のinputヘルパーは少し違うので、以外とはまるひとは多いのではないかと思います。
それでは、早速どうしたらよいか紹介します。
Select Formで入力を必須にするには、引数の渡す場所が肝心で、3番めにrequired: true
を渡してあげると実現できます。そのため、一番シンプルなコードは下記のようになります。
<%= form_with(model: item, local: false) do |form| %> <div class="select"> <%= form.select(:category, ["おもちゃ", "家電", "家具"],{}, required: true) =%> </div> <% end %>
ここで着目すべきは2番めには空のオブジェクトを渡していることです。
ここはAPIを見るとよくわかります。下記をみるとselectに関してのオプションが2番目にきて、3番めにhtmlに関してのオプションがくることがわかると思います。
今回はSelectに関してのオプションを指定していないので、2番めに空のオブジェクトを渡して、3番目にrequired: true
を渡しています。
select(object, method, choices = nil, options = {}, html_options = {}, &block) ⇒ Object
ただし、これだとUX的に悪いので、プロンプトを表示するとよいです。 プロンプトありで入力を必須にする必要は2つあり、下記のようになります。
プロンプトを使った方法
<%= form_with(model: item, local: false) do |form| %> <div class="select"> <%= form.select(:category, ["おもちゃ", "家電", "家具"],{ prompt: "カテゴリを選んでください" }, :required => true ) =%> </div> <% end %>
include_blank
を使った方法
<%= form_with(model: item, local: false) do |form| %> <div class="select"> <%= form.select(:category, ["おもちゃ", "家電", "家具"],{ :include_blank => 'カテゴリを選んでください' }, :required => true ) =%> </div>
上記のようにすると、下記のように入力が必須になり、かつ、プロンプトを選んでも入力をしてないと判断されます。
また、include_blank
, prompt
を使った際の最終的なHTMLはおなじになり、下記のようになります。
<select required="required" name="item[category]" id="item_category"> <option value="">カテゴリを選んでください</option> <option value="おもちゃ">おもちゃ</option> <option value="家電">家電</option> <option value="家具">家具</option> </select>
prompのものはvalueがからなので選んでも、入力がからなので入力されていないことになるんですね。