質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1065閲覧

【Rails】多 対 多 のModelに同時に値を登録したい

YO14

総合スコア45

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2020/05/31 09:30

実現したいこと

ユーザーが所属するグループを作成する。
その際、グループ作成画面では、
・グループ名 をテキスト入力
・グループに所属させるメンバー を一覧で出して、チェックボックスで選択
して作成。
ユーザー情報は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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/05/31 09:59

回答依頼いただきましたが、Ruby自体知見が全くありませんので、あしからず。
YO14

2020/06/01 14:01

お手数おかけしました
guest

回答1

0

自己解決

ControllerとViewのコードが適切でなかったようで、修正することで、Group登録時にGroup_userも更新されるようになりました。

groups_controller(修正後)

Ruby

1def index 2 @text = 'ようこそ、グループのインデックスページです' 3 end 4 5 def new 6 @group = Group.new 7 @group.group_users.build #この記述で、GroupとGroup_userを紐付け 8 9 @users = User.all #Userテーブルの中の全てのユーザーを配列形式で格納したい 10 end 11 12 def create 13 @group = Group.new(group_params) 14 15 if @group.save 16 flash[:notice] = "グループを作成しました" 17 redirect_to("/groups/new") 18 else 19 flash.now[:alert] = "グループ作成に失敗しました" 20 render("groups/new") 21 end 22 end 23 24 private 25 def group_params 26 #チェックボックスで選択したuser_idは、配列としてパラメータで渡ってくるのでそれをpermit 27 params.require(:group).permit(:name, { user_ids: [] }) 28 end

app/groups/new.html.erb

Ruby

1<%= form_with(model: @group, url: groups_new_path, local: true) do |f| %> 2 <div> 3 <p>グループ名</p> 4 <%= f.text_field :name %> 5 </div> 6 <br> 7 <p>所属するメンバー</p> 8 9 <div class="field"> 10 <br> 11 <%#collection_check_boxesを利用 %> 12 <%= collection_check_boxes(:group, :user_ids, User.all, :id, :name ) do |t| %> 13 <% t.label { t.check_box + t.text } %> 14 <% end %> 15 </div> 16 <br> 17 <%= f.submit %> 18<% end %>

投稿2020/06/01 14:09

YO14

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問