質問: rails4でチェックボックスを使って同じモデルに配列で5個の文字列を保存したいのですがうまくできません。 作りたいものは、ユーザーがポストするときにそのポストに自分でタグ付けをできるようにすることです。 postモデルが親で、タグモデルが子の関係の関連付けをしました。 `accepts_nested_attributes_for`を使って作成しています。 `post.rb` ``` class Post < ActiveRecord::Base has_many :tags accepts_nested_attributes_for :tags end ``` `tag.rb` ``` class Tag < ActiveRecord::Base belongs_to :post end ``` schemafileはこんな感じです。 タグモデルの中には、外部キーである`post_id`と、タグの種類を文字列で保存するためのstring型の`category`カラムがあります。 ``` create_table "tags", force: :cascade do |t| t.string "category" t.integer "post_id" end ``` `postコントローラー`にはtagモデルに関係する記述はストロングパラメーターのみです。 ``` class PostsController < ApplicationController private def post_params params.require(:post).permit(:content, :image, tags_attributes: [:category]) end end ``` ビューです ``` <%= form_for @post do |f| %> <%= f.file_field :image, :id => 'post_post_img' %> <%= f.text_area :content %> <%= f.fields_for :tags, Tag.new do |tag| %> <%= tag.check_box_tag :category,{},'background' %>バックグラウンド <%= tag.check_box :category,{},'translation' %>翻訳 <%= tag.check_box :category,{},'trivia' %>豆知識 <%= tag.check_box :category,{},'interpretation' %>解釈 <%= tag.check_box :category,{},'other' %>その他 <% end %> <% end %> ``` こうすると、複数にチェックしても最後にチェックした値か、どれか一つにチェックした場合、`0`の値が送られてしまいます。 ``` <%= form_for @post do |f| %> <%= f.file_field :image, :id => 'post_post_img' %> <%= f.text_area :content %> <%= f.fields_for :tags, Tag.new do |tag| %> <%= tag.check_box_tag :category,{},'background' %>バックグラウンド <% end %> <%= f.submit %> <% end %> ``` このように、バックグラウンドのみのチェックボックスを表示させて送信すると、ちゃんと`category`カラムに`background`が保存されます。 これをちゃんと配列でモデルに保存したいのですがどのようにやれば良いでしょうか? 最終的には、`@post.tag.where(category:"background").present?`みたいな感じで、値を取り出すのが目標です。 よろしくお願いします。
回答: ``` check_box_tag 'post[category][]','選択肢' , 初期値 ``` で実装してみてください。 追記 すみません。上の書き方だとコントローラー側でちょっと加工しないとダメでしたね。 ``` check_box_tag 'post[tags_attributes][][category]','選択肢' , 初期値 ``` で実装すれば行けると思います。いけない場合はパラメータのモデルへの渡し方が悪いので,binding.pryなどでparamsの中身を確認して,正しく整形したものをモデルに渡してください。 質問者様の意図している使い方をみる限りfields_forを使って書くのは難しそうです。 ちなみにうちのプロダクトでは,accepts_nested_attributes_forを使わない方法で開発サイクルを回しています。 accepts_nested_attributes_forを使わない理由はこちらをご覧ください。サービスの規模が小さければ問題ないですが,代替する方法としてはformを作成する方法が一般的かと思います。