LoginSignup
3
0

More than 5 years have passed since last update.

form_forにおいて、データベースにある項目から選択させる。

Posted at

form_forにおいて、カテゴリを選択させる場合、ユーザーは既存のものからカテゴリを選ぶと言う行為をします。その場合、すでにあるCategoryモデルからひとつを選ばせたいと言うわけですが、そのための方法をまとめました。

ズバリ、collection_selectメソッドを使いましょう!!

view

new.html.erb
<%= form_for(@post) do |f| %>
   <%= f.label:title %>
   <%= f.text_field:title %>

   <%= f.label:content %>
   <%= f.text_field:content,size:50 %>

   <%= fields_for :category ,(@categroy) do |category| %>

   <%= category.label:category %>
   <%= category.collection_select :category, Category.all, :id, :category %>

   <% end %>

   <%= f.submit "提出する" %>



   <% end %>

これは少しややこしくなっていますが、注目すべきは

new.html.erb
   <%= fields_for :category ,(@categroy) do |category| %>

   <%= category.label:category %>
   <%= category.collection_select :category, Category.all, :id, :category %>

上記のところです。HTMLにすると下記のようになります。


<label for="category_category">Category</label> 
 <select name="category[category]" id="category_category">
<option value="5">Ruby</option> 
<option value="6">Html</option> 
<option value="7">bootstrap</option> 
<option value="8">学習法</option></select> 

collectionメソッドのリファレンスは下記です。
collection_select(オブジェクト名, プロパティ名, オブジェクトの配列, value属性の項目, テキストの項目 [, オプション])

ここで言うと、fields_forの下にあるので、すでにオブジェクト名は不要です。よって、プロパティ名の設定ですが、上記だと間違ってます(これでもいけるかもですが)。実際に渡したいのは、idのところなので、select nameもcategory[id]となるのがbestですよね。

そこで、

new.html.erb
   <%= fields_for :category ,(@categroy) do |category| %>

   <%= category.label:category %>
   <%= category.collection_select :id, Category.all, :id, :category %>


<label for="category_category">Category</label> 
 <select name="category[id]" id="category_id">
<option value="5">Ruby</option> 
<option value="6">Html</option> 
<option value="7">bootstrap</option> 
<option value="8">学習法</option></select> 

に変更しました。プロパティ名とは、formで送る箱の中でのプロパティって意味です。
今回だと、[:category]という箱の中で、どの配列に入れて送るかということでした。

次に選択肢に関する配列を渡してあげます。今回でいうと、Categoryモデルにある配列ですね。その中から、渡す項目と表示させる項目を選ぶイメージです。
今回でいうと、categortyプロパティを表示させて、実際にPostで送る際はidを送りたいので上記のような順番になりました。

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"cIqdAA0MBoYcwzFPItmGZ21tLFdxsJB2lWmkNYQccn7rg8uhO/xImAA1h8+rf4/XC7KtEx4WBdmislBNzcsdcddA==", "post"=>{"title"=>"vf", "content"=>"vffv"}, "category"=>{"id"=>"7"}, "commit"=>"提出する"

パラメーターでは、実際に[:category][:id]->7が送られていますね。面白い。
実際の選択肢は下記になります。

スクリーンショット 2018-05-27 16.15.56.png

このようにして、
1.選択肢と実際に送る値を変更できる
2.collection_selectによって、選択肢をデータベースから引っ張れる

ということでした。
以上です。

3
0
0

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
3
0