前提・実現したいこと
rails5でウェブアプリを作成しています。
devise4を使用しログイン周りを作成しました。
ユーザーのアカウント作成時にアドレスなどのアカウント情報と共に
ユーザーが選択したカテゴリも同時に保存したいです。
試したこと
User と Category で多対多の関係を構築し、中間モデルとしてuser_categoryを作成しました。
アカウント登録時に選択したカテゴリのidを保存したいため,
accepts_nested_attributes_for :user_categories
とし関連づけました。
それぞれのモデルは以下
###user.rb
has_many :user_categories, dependent: :destroy,foreign_key:"category_id" has_many :categories, through: :user_categories accepts_nested_attributes_for :user_categories,allow_destroy: true
###category.rb
has_many :user_categories, dependent: :destroy,foreign_key:"user_id" has_many :users, through: :user_categories
###user_category.rb
belongs_to :user belongs_to :category
また登録時にチェックボックスにより複数保存したいため、
viewでcollection_check_boxesを使いました。
###new.html.erb
<%= form_for(resource, as: resource_name, url: registration_path(resource_name) ,html: {id: 'example-form'}) do |f| %> --------------省略------------------- <div class="form-group"> <%= f.label :category ,'カテゴリーの選択' %><br /> <%= collection_check_boxes(:user, :category_ids,Category.where(is_recommended: true).limit(6), :id, :name) do |b| %> <%= b.label {b.check_box + b.text } %> <% end %> </div> <% end %>
また保存の際にストロングパラメーターに設定しないといけないとの事でしたので、以下のように設定しました。
###application_controller
def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up) do |user_params| user_params.permit({ roles: [] },:email,:password,:password_confirmation,:name, :birthday, :gender,user_categories_attributes: {:category_ids=> [] }) end end
def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up,keys:[:name,:birthday,:gender,user_categories_attributes:[:id,:user_id,:category_ids => [] ]]) end
上記2パターンで試しましたがいづれも保存できないです。
submitボタンを押下すると以下のエラーがターミナルで表示され、DBには保存されませんでした。
発生している問題・エラーメッセージ
ターミナル
Unpermitted parameter: :category_ids
補足情報(FW/ツールのバージョンなど)
rails -v 5.1.4
ruby -v 2.4.1
devise -v 4.3
2日ほどかけて原因を探していますが、どこが原因なのか分からず、焦っております。。
お手数ですが、どなたか分かればヒントでもいいのでご教授いただけないでしょうか?
宜しくお願い致します。
------追記---------------
new.html.erb
<%= f.fields_for :category do |category| %> <%= collection_check_boxes :user_categories_attributes, :category_ids, Category.all, :id, :name %> <% end %>
上記により以下のパラメーターが取得できた
Parameters: {"utf8"=>"✓", "authenticity_token"=>"/wvgHWAqbewmsqXQ4UIrr8WDiafgQMAI07GL5dvdpV7KgvklrsyVajNAYWcwWVI6+TZ9BEh+oC4mkPNqyxumUg==", "user"=>{"name"=>"test18", "email"=>"test18@aaa.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "birthday(1i)"=>"1986", "birthday(2i)"=>"1", "birthday(3i)"=>"7", "gender"=>"1"}, "user_categories_attributes"=>{"category_ids"=>["", "2", "3", "6"]}, "commit"=>"次へ"}
が保存できないのでやはりストロングパラメーターの設定がおかしいのかもしれません
f configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up) do |user_params| user_params.permit({ roles: [] },:email,:password,:password_confirmation,:name, :birthday, :gender,user_categories_attributes: [category_ids:[] ]) end end
-------追記--------
<%= f.fields_for :category do |fc| %> <%= fc.collection_check_boxes :category_ids, Category.all, :id, :name %> <% end %>
にてポストしたところUnpermitted parameter: :category
となりましたので、
<%= f.label :user_categories_attributes ,'カテゴリーの選択' %><br /> <%= f.fields_for :user_categories_attributes do |fc| %> <%= fc.collection_check_boxes :category_ids, Category.all, :id, :name ,include_hidden: false%> <% end %>
へ変更し以下のパラメータで正しいように思われますが、
Parameters: {"utf8"=>"✓", "authenticity_token"=>"HrQJPZyDbz+j1yr0hxLI98PeiidIwAHx4rOey+U2QOCvDz90lZjhZgwGdczGx6uCtdzvt9px4GpD/LuoNxrI5w==", "user"=>{"name"=>"sasasa", "email"=>"sasasa@aaa.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "user_categories_attributes"=>{"category_ids"=>["3", "5", "6"]}, "birthday(1i)"=>"1984", "birthday(2i)"=>"1", "birthday(3i)"=>"1", "gender"=>"1"}, "commit"=>"次へ"}
#TypeError in Users::RegistrationsController#create
no implicit conversion of String into Integer
となりました。deviseのRegistrationsController を継承している以下のUsers::RegistrationsControllerのcreateアクションでの挙動がおかしいようです。。