form_forにおいて、カテゴリを選択させる場合、ユーザーは既存のものからカテゴリを選ぶと言う行為をします。その場合、すでにあるCategoryモデルからひとつを選ばせたいと言うわけですが、そのための方法をまとめました。
ズバリ、collection_selectメソッドを使いましょう!!
view
<%= 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 %>
これは少しややこしくなっていますが、注目すべきは
<%= 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ですよね。
そこで、
<%= 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が送られていますね。面白い。
実際の選択肢は下記になります。
このようにして、
1.選択肢と実際に送る値を変更できる
2.collection_selectによって、選択肢をデータベースから引っ張れる
ということでした。
以上です。