以下のようなモデルで構成しており、
GamesCategoriessは中間テーブルです。
いわゆる多対多の関係のモデルです。
- Game
- GamesCategories
- Category
このような状況の中
viewにチェックボックスを設定する際に、チェックボックスをつけた数だけ、フォームが表示されてしまいます。
原因はview側でeachを回しているところだとは想像できるのですが、仮にここをループで回さないと、
fields_forのところで以下のようなエラーがでてしまうため、ループで回しました。
http://stackoverflow.com/questions/18595542/fields-for-not-working-for-has-many-association
@categories.each do |category|
やりたいこととしましては、チェックボックを複数つけた時に、
チェックボックのフォームは一つのまま、そのフォーム内に、複数のチェックがついていることです。
現状では、
複数のフォームが生成され、
一つのフォームに一つのチェックがついてしまいました。
参考までにソースの一部を転記致します。
views/games/_form.html.slim
- @categories.each do |category| = f.fields_for :category_ids, category do |ff| .form-group .field.control-group = ff.label :name, class: 'control-label' = ff.collection_check_boxes :category_id, Category.all, :id, :name, {}, class: 'form-control-inline'
game_controller
params[:game][:category_ids][:category_id].each do |category_id| next if category_id.blank? @game.games_categories.create!(game_id: @game.id, category_id: category_id) end # params[:game][:category_ids][:category_id] # => ["1", "4", "6"] # チェックをつけたid
どのように実装すれば解決するのか検討がつかず、右往左往しております。
アドバイスを頂けますと幸いです。
よろしくお願いします。
追記 2016/05/05 18時
以下のページを吟味して何度か試したところ上手くいきました。
http://ruby-rails.hatenadiary.com/entry/20150113/1421149061
ただ、よくわからないのは以下の一文です。
以下の例でいうと、Productモデルにはcateogyr_idsというカラムがないのに
なぜ、これで、複数のINERT文が走るのでしょうか?
has_manyメソッドのおかげというふうには記載されておりますが、
has_manyメソッドを記述すれば、ids属性というのが付与されるのでしょうか・・・。
ここの処理がわからず、railsのhas_manyの処理を調べていたのですが、解決できず、モヤモヤしております。
「多対多関係」をモデルで定義しておくとProductのcateogyr_ids属性に配列でカテゴリIDを設定することでhas_manyメソッドのおかげで複数のINERT文が走ります。
あなたの回答
tips
プレビュー