実現したいこと
ユーザーが所属するグループを作成する。
その際、グループ作成画面では、
・グループ名 をテキスト入力
・グループに所属させるメンバー を一覧で出して、チェックボックスで選択
して作成。
ユーザー情報はUserテーブルに、グループ情報はGroupテーブルに、
どのユーザーがどのグループに所属しているか、というデータは、group-userという中間テーブルに保存。
分からないこと
グループ作成画面で、グループ名とグループに所属させるメンバーを選択してグループを作成しても失敗します。
log/development.logを見ると、Unpermitted parameterというエラーが出ています。
Ruby
1Started POST "/groups/new" for ::1 at 2020-05-31 18:12:17 +0900 2Processing by GroupsController#create as HTML 3 Parameters: {"utf8"=>"✓", "authenticity_token"=>"[省略]", "group"=>{"name"=>"テストグループ053117", "group_user"=>{"user_id"=>"1"}}, "commit"=>"Create Group"} 4Unpermitted parameter: :group_user
group_userを許可する、という内容のコードは、GroupControllerのストロングパラメーターに記述しているつもりですが、
その記述方法が誤っているのか、
チェックボックスを設置するコードの書き方が悪いのか、
groupとgroup_userとの関連付けがうまくいっていないのか、
問題の切り分けができず詰まっています。
どなたかお知恵をお貸しいただけないでしょうか。宜しくお願いいたします。
GroupController
1class GroupsController < ApplicationController 2 3 def index 4 @text = 'ようこそ、グループのインデックスページです' 5 end 6 7 def new 8 @group = Group.new 9 @users = User.all #Userテーブルの中の全てのユーザーを配列形式で格納 10 end 11 12 def create 13 @group = Group.new(group_params) 14 @group.group_users.build 15 16 if @group.save 17 flash[:notice] = "グループを作成しました" 18 redirect_to("/groups/new") 19 else 20 flash.now[:alert] = "グループ作成に失敗しました" 21 render("groups/new") 22 end 23 end 24 25 def show 26 27 end 28 29 private 30 def group_params 31 params.require(:group).permit(:name, group_user: []) 32 end 33 34 35 36end 37
app/views/group/new.html.erb
<%= form_with(model: @group, url: groups_new_path, local: true) do |f| %> <div> <p>グループ名</p> <%= f.text_field :name %> </div> <br> <p>所属するメンバー</p> <%= f.fields_for :group_user do |ff| %> <%# @userをループ処理でnameを取り出して、ラベルに表示する処理を入れたいが、まず固定値でいいのでuser_idが正しく登録されることを実現したい %> <%# @users.each do |user| %> <%= ff.check_box :user_id,{},"1",nil%> <%= ff.label :name, "ユーザー1" %> <%# end %> <% end%> <br> <%= f.submit %> <% end %>
model/Group
class Group < ApplicationRecord has_many :users, through: :group_users has_many :group_users, dependent: :destroy accepts_nested_attributes_for :group_users, allow_destroy: true validates :name, presence: true, length: {maximum: 15} end
model/group_user
class GroupUser < ApplicationRecord belongs_to :user belongs_to :group end
model/user
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :groups, through: :group_users has_many :group_users, dependent: :destroy end
回答1件
あなたの回答
tips
プレビュー