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

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

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

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

Ruby

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

Q&A

2回答

597閲覧

group_userテーブル(中間テーブル)とgroupテーブルの両方に一つのフォームからデータを送りたい

mitsukude

総合スコア10

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2018/11/07 04:43

group_userテーブル(中間テーブル)とgroupテーブルの両方に一つのフォームからデータを送りたい

親にuser, group, 子にgroup_userをもつモデルを作っているのですが、グループ登録画面から一つのフォームでgroup_userテーブル(中間テーブル)とgroupテーブルの両方にデータを送りたいです。調べつつやってはみているのですが、中間テーブルの方にどうしてもデータを送ることができません。
groupテーブルにはデータが送られています。

コード

rb

1class Group < ApplicationRecord 2 3 has_many :users, through: :group_users 4 has_many :group_users 5 accepts_nested_attributes_for :group_users 6 7 validates :name, {presence: true} 8end 9

rb

1class GroupUser < ApplicationRecord 2 belongs_to :user, optional: true 3 belongs_to :group, optional: true 4end 5

html

1<div class="main groups-new"> 2 <div class="container"> 3 <div class="form-heading">グループ作成</div> 4 <div class="form groups-form"> 5 <div class="form-body"> 6 7 <%= form_for @group, url: groups_path, html: { method: :post } do %> 8 <label for="name">名前</label> 9 <input id="name" name="name" /> 10 11 12 <%= fields_for :group_users do %> 13 <label for="group_id">グループID</label> 14 <input id="group_id" name="group_id" /> 15 <input type="submit" value="登録"> 16 <% end %> 17 <% end %> 18 19 20 </div> 21 </div> 22 </div> 23</div>

rb

1class GroupsController < ApplicationController 2 def index 3 end 4 def show 5 end 6 def new 7 @group = Group.new 8 @group.group_users.build 9 end 10 def create 11 @group = Group.new( 12 name: params[:name], 13 group_id: params[:group_id] 14 ) 15 if @group.save 16 flash[:notice] = "グループ登録が完了しました" 17 redirect_to("/main") 18 else 19 render("groups/new") 20 end 21 end 22 23 private 24 25 def group_params 26 params.require(:group).permit(:name, group_users_attributes: [:id, :group_id]) 27 end 28end

試したこと

fields_forを使うといいらしいがうまくいかない(使い方がよくわからない)

補足情報

Ruby 2.2.3
rails 5

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

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

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

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

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

guest

回答2

0

すみません。全体的に書いてみました。以前回答した箇所も変更しました。
グループを新規作成するとその人はグループに自動で所属すると言う流れですかね。

model

Ruby

1class Group < ApplicationRecord 2 3 has_many :users, through: :group_users 4 has_many :group_users 5 6 validates :name, {presence: true} 7end

Ruby

1class GroupUser < ApplicationRecord 2 belongs_to :user, optional: true 3 belongs_to :group, optional: true 4end

controller
groups_controllerでuser情報は取得できますか?userでログインしていると言う体で書いてみます。

Ruby

1class GroupsController < ApplicationController 2 def index 3 end 4 5 def show 6 end 7 8 def new 9 @group = Group.new 10 end 11 12 def create 13 @group = current_user.groups.build(group_params) # current_userはログインしている体でuserを取得できると仮定しています 14 if @group.save 15 flash[:notice] = "グループ登録が完了しました" 16 redirect_to("/main") 17 else 18 render("groups/new") 19 end 20 end 21 22 private 23 24 def group_params 25 params.require(:group).permit(:name) 26 end 27end

view
group_idはcontrollerでuserのリレーションでgroupのレコードを作成するときに中間テーブルに勝手に渡されるので省きました

HTML

1<div class="main groups-new"> 2 <div class="container"> 3 <div class="form-heading">グループ作成</div> 4 <div class="form groups-form"> 5 <div class="form-body"> 6 7 <%= form_for @group, url: groups_path, html: { method: :post } do |f| %> 8 <%= f.label "名前" %> 9 <%= f.text_field :name %> 10 11 <%= f.submit "登録" %> 12 <% end %> 13 </div> 14 </div> 15 </div> 16</div>

もしグループ作成者と違う人が既存のグループに所属したい場合はGroupUserのコントローラーで、中間テーブルのレコードを追加することになります。

投稿2018/11/08 09:46

編集2018/11/08 09:53
KiyoKuro

総合スコア51

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

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

mitsukude

2018/11/13 06:57

遅くなり申し訳無いです。deviseでログインしているcurrent_userにはuserから情報を持ってこれるようにしているはずなのですが、登録ボタンを押すと『Cannot have a has_many :through association 'User#groups' which goes through 'User#group_users' before the through association is defined.』というエラーになってしまいます。知識不足で申し訳ないのですが解決策をアドバイスいただけるとありがたいです。
KiyoKuro

2018/11/15 02:08 編集

これと同じように思えるので以下のように試してみてはどうでしょうか https://stackoverflow.com/questions/49450963/activerecordhasmanythroughordererror-cannot-have-a-has-many-through-associat http://y-yagi.hatenablog.com/entry/2017/01/05/060829 一番したに変更されたことが説明されてます throughアソシエーションの前に中間テーブルのリレーションを定義しないといけないようです ```Ruby class Group < ApplicationRecord has_many :group_users has_many :users, through: :group_users end ``` ```Ruby class GroupUser < ApplicationRecord belongs_to :user, optional: true belongs_to :group, optional: true end ``` ```Ruby class User < ApplicationRecord has_many :group_users has_many :groups, through: :group_users end ```
guest

0

もしコントローラーでuserの情報を取得できているのであれば以下のようにgroupのリレーションでuserを保存すると中間テーブルも同時に保存されます。Userからのリレーションでも同様に保存できます。user.groups.build(Groupの属性)

Ruby

1def create 2 @group = Group.new( 3 name: params[:name], 4 group_id: params[:group_id] 5 ) 6 @group.users.build(Userの属性) 7 if @group.save 8 flash[:notice] = "グループ登録が完了しました" 9 redirect_to("/main") 10 else 11 render("groups/new") 12 end 13end

期待通りの回答になっていなかったらすみません????‍♂️

投稿2018/11/07 10:07

KiyoKuro

総合スコア51

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

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

mitsukude

2018/11/08 04:04

回答ありがとうございます! 試してみたのですが”Controller action should call one model method other than an initial find or new”このようなエラーが出てしまいうまくいかないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問