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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

2858閲覧

多対多のモデルをデータベースに保存できません

Dach

総合スコア17

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/05/04 03:46

RoomとUserという二つのモデルと、その中間テーブルとしてRoomUserがあります。
そこで、Roomを登録すると同時にRoomUserにも登録させたいと考えています。

しかし、accepts_nested_attributes_forを使って登録させたいのですが、roomsテーブルには登録されてもroom_usersテーブルには登録されませんでした。

どこが悪いのか教えていただければ嬉しいです。
よろしくお願いします。

↓コンソール上のパラメータです

Parameters: {"utf8"=>"✓", "authenticity_token"=>"02WXXlPreLySyjer0s7Pt8GveyB3pnKBzCnpbxjPofjz1WgJTGShwY8JoyjyQaBDiKbNJiePgqqsSUxIooHCPA==", "room"=>{"room_users_attributes"=>{"0"=>{"user_id"=>"1"}}, "name"=>"with friends"}, "commit"=>"新規チャットルーム作成"}

ruby

1class RoomsController < ApplicationController 2 def new 3 @room = Room.new 4 @room.room_users.build 5 end 6 7 def create 8 @room = Room.new(room_params) 9 if @room.save 10 flash[:success] = "チャットルームの登録が完了しました" 11 redirect_to @room 12 else 13 render :new 14 end 15 end 16 17 private 18 def room_params 19 params.require(:room).permit(:id, :name, room_users_attributes: [:user_id]) 20 end 21end

ruby

1class User < ApplicationRecord 2 has_many :room_users, foreign_key: 'user_id' 3 has_many :rooms, through: :room_users 4 accepts_nested_attributes_for :room_users 5 6 has_secure_password 7end

ruby

1class Room < ApplicationRecord 2 has_many :room_users, foreign_key: 'room_id' 3 has_many :users, through: :room_users 4 5 accepts_nested_attributes_for :room_users 6end

ruby

1class RoomUser < ApplicationRecord 2 belongs_to :room 3 belongs_to :user 4end

html

1<%= form_for(@room) do |f| %> 2 <%= f.fields_for :room_users do |ruf| %> 3 <%= ruf.label :name, '友人リスト' %> 4 <%= ruf.number_field :user_id %> 5 <% end %> 6 7 <%= f.label :name, 'チャットルーム名' %> 8 <%= f.text_field :name %></br> 9 10 <%= f.submit "新規チャットルーム作成" %> 11<% end %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

class

1 2 private 3 def room_params 4 # user_id ではなく、id にで試してもらえます? 5 params.require(:room).permit(:id, :name, room_users_attributes: [:id]) 6 end 7end 8

以下の記事が参考になるかと思いますので、参考にしてください
試してみて、できないようであれば状況・エラー等載せてもらえればまた回答させていただきますね!
Rails4でcollection_check_boxesを使って、多対多の関連をチェックボックスで設定する

投稿2017/05/06 14:31

hiyashikyuri

総合スコア388

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

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

Dach

2017/05/08 04:55 編集

room_users_attributes: [:id]にしたのですが、以下のようになり保存ができませんでした… ---------- Started POST "/rooms" for ::1 at 2017-05-08 11:37:34 +0900 Processing by RoomsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"5jQbck70zP3Y8meSZpyvGFehqQxYvQK06kD93UfqPp1DYcmOj7WCQZEwqrXNQnPrrm/qBg+6m2A5rdRzNRxgDg==", "room"=>{"room_users_attributes"=>{"0"=>{"user_id"=>"1"}}, "name"=>"with friends"}, "commit"=>"新規チャットルーム作成"} Unpermitted parameter: user_id (0.1ms) BEGIN (0.2ms) ROLLBACK Rendering rooms/new.html.erb within layouts/application Rendered rooms/new.html.erb within layouts/application (3.6ms) Completed 200 OK in 49ms (Views: 31.3ms | ActiveRecord: 0.3ms) ---------- ちなみに、:user_idのままだと以下のようになりました。 user_idをもとにUserモデルを検索してはいるのですが、その次でROLLBACKされてしまっています… ---------- (0.5ms) BEGIN User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 (0.2ms) ROLLBACK ----------
Dach

2017/05/10 04:25

解決しました! rails5になってから、belongs_toではrequiered: trueがデフォルトになっているらしく、それをfalseにするために optional: true オプションを付ければいいらしいです! --- belongs_to :room, optional: true belongs_to :user, optional: true ---
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問