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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

425閲覧

ユーザーをグループに参加させたいです。

Taka2401

総合スコア8

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/10/16 04:46

編集2021/10/16 08:14

前提・実現したいこと

group:memberrをたくさん持つ
member :たくさんのgroupに所属する
group_member :中間テーブル

認証機能なし(current_userが使えない)

グループに不参加のメンバーが参加するを押すと、グループに登録できるようにしたいです。

イメージ説明

発生している問題

グループに登録することはできましたが、testで参加するを押すとtest2が登録されてしまいます。
コントローラーで、全ての未参加メンバーをeachで抽出しているのでそこが原因になっていると思いますが、
どうすれば参加するを押したときに、メンバーのidを参照してくれるのかがわかりません。

該当のソースコード

# グループメンバーコントローラー class GroupMembersController < ApplicationController def create @join_member = GroupMember.new @join_member.member_id = params[:group_member][:member_id] @join_member.group_id = params[:group_id] if @join_member.save redirect_to root_path end end end
# グループ詳細ページ <h2> グループに不参加のメンバー </h2> <table> <thead> <tr> <th>Name</th> <th colspan="3"></th> </tr> </thead> <tbody> <%= form_with(model:[@group, @join_member], local: true) do |f| %> <% @not_members.each do |member| %> <%= f.hidden_field :member_id, value: member.id %> <tr> <td><%= member.name %></td> <td><%= f.submit "参加する" %></td> </tr> <% end %> <% end %> </tbody> </table>

試したこと

手探りですが、https://www.javadrive.jp/ruby/hash/index7.htmlを参考に、
idに一意のkeyをつけることができないか試してみました。

# controllerに追加 オブジェクト.each{|key, value| 実行する処理1 実行する処理2 }

何か解決の糸口になるヒントを頂けると幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

view のフォームに member の id を含むようにします。

erb

1<%= f.hidden_field :member_id, value: member.id %>

そうするとコントローラーでその値を受け取ることができます。

ruby

1# params[:join_member][:member_id] は別の名前になってるかもしれません 2# Rails のログに Parameters として表示されるので確認してください 3@join_member.member_id = params[:join_member][:member_id]

まとめると

erb

1 <% @not_members.each do |member| %> 2 <%= form_with(model:[@group, @join_member], local: true) do |f| %> 3 <%= f.hidden_field :member_id, value: member.id %> 4 <tr> 5 <td><%= member.name %></td> 6 <td><%= f.submit "参加する" %></td> 7 </tr> 8 <% end %> 9 <% end %>

ruby

1 def create 2 @join_member = GroupMember.new 3 @join_member.member_id = params[:join_member][:member_id] 4 @join_member.group_id = params[:group_id] 5 6 if @join_member.save 7 redirect_to root_path 8 end 9 end

投稿2021/10/16 07:25

編集2021/10/16 10:32
neko_daisuki

総合スコア2090

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

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

Taka2401

2021/10/16 08:15

回答いただきありがとうございます。 仰って頂いたように入力してみましたが、 NoMethodError (undefined method `[]' for nil:NilClass):と表示されました。 パラメーターは、"group_member"=>{"member_id"=>"2"}, "commit"=>"参加する", "group_id"=>"9"}と出ていたので、 @join_member.member_id = params[:join_member][:member_id]を @join_member.member_id = params[:group_member][:member_id]に変更しましたが、 testで参加するを押しても、test2で登録されてしまいます。。 コードも変更後に修正しておきます。
neko_daisuki

2021/10/16 10:07

エラーが出るのは以下の行ですか? @join_member.member_id = params[:group_member][:member_id] test の id が 1、test2 の id が 2 でしょうか?
Taka2401

2021/10/16 10:28

エラーが出るのは以下の行ですか? params[:join_member]の時に、 @join_member.member_id = params[:join_member][:member_id]の行がエラーになります。 エラーメッセージ NoMethodError in GroupMembersController#create undefined method `[]' for nil:NilClass test の id が 1、test2 の id が 2 でしょうか? はい、その通りです。
neko_daisuki

2021/10/16 10:33

同じフォームの中に全部のメンバーが入っていたのを メンバーごとにフォームを作成するように回答を編集しました。
Taka2401

2021/10/16 10:42

ありがとうございます! 無事に表示できました!! フォームをメンバーごとに独立させるということですね。 丁寧にご指摘いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問