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

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

ただいまの
回答率

90.38%

  • Ruby

    9925questions

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

  • Ruby on Rails

    9337questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 982

Dach

score 11

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"=>"新規チャットルーム作成"}
class RoomsController < ApplicationController
    def new
    @room = Room.new
    @room.room_users.build
  end

  def create
    @room = Room.new(room_params)
    if @room.save
      flash[:success] = "チャットルームの登録が完了しました"
      redirect_to @room
    else
      render :new
    end
  end

  private
    def room_params
      params.require(:room).permit(:id, :name, room_users_attributes: [:user_id])
    end
end
class User < ApplicationRecord
  has_many :room_users, foreign_key: 'user_id'
  has_many :rooms, through: :room_users
  accepts_nested_attributes_for :room_users

  has_secure_password
end
class Room < ApplicationRecord
  has_many :room_users, foreign_key: 'room_id'
  has_many :users, through: :room_users

  accepts_nested_attributes_for :room_users
end
class RoomUser < ApplicationRecord
  belongs_to :room
  belongs_to :user
end
<%= form_for(@room) do |f| %>
    <%= f.fields_for :room_users do |ruf| %>
        <%= ruf.label :name, '友人リスト' %>
        <%= ruf.number_field :user_id %>
    <% end %>

    <%= f.label :name, 'チャットルーム名' %>
    <%= f.text_field :name %></br>

    <%= f.submit "新規チャットルーム作成" %>
<% end %>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/08 13:54 編集

    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
    ----------

    キャンセル

  • 2017/05/10 13:25

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

    ---
    belongs_to :room, optional: true
    belongs_to :user, optional: true
    ---

    キャンセル

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

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    9925questions

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

  • Ruby on Rails

    9337questions

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