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

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

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

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

1301閲覧

中間テーブルにデータが保存されません

syu_akita

総合スコア1

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2021/01/21 08:10

前提・実現したいこと

現在、チャットアプリの制作をしています。 その際にuserモデルとroomモデル間で中間テーブルを作成するのですが作成しビューを記載したのですがデータが保存できません。 原因として考えているのはuser情報にactive_hashを用いているため何かしらのバリデーションがかかってしまい保存ができないのではないかと考えています。

発生している問題・エラーメッセージ

エラーメッセージは特に出ていないためbinding.pryで止めた際のparamsの中身を貼らせていただきます

<ActionController::Parameters {"authenticity_token"=>"B6ucPoSy7PxPvfWFDecvHUfpuVg3v9zZhOMRzwUeSZGpzYJ1tH17M79Haho6L+WSEhQBTJoZI/a8FcFkfzTrGQ==", "room"=><ActionController::Parameters {"name"=>"2021年度 2年1組", "user_ids"=>["1", "4"]} permitted: false>, "commit"=>"Create Room", "controller"=>"rooms", "action"=>"create"} permitted: false> [2] pry(#<RoomsController>)> @room.save => false

該当のソースコード

room#new のビュー

ruby

1<div class='chat-room-form'> 2 <h1>新規チャットルーム</h1> 3 <%=form_with model: @room, local: true do |f|%> 4 <div class='chat-room-form__field'> 5 <div class='chat-room-form__field--left'> 6 <%= f.label :チャットルーム名, class: 'chat-room-form__label'%> 7 </div> 8 <div class='chat-room-form__field--right'> 9 <%= f.text_field :name, class: 'chat__room_name chat-room-form__input', placeholder: 'チャットルーム名を入力してください'%> 10 </div> 11 </div> 12 <div class='chat-room-form__field'> 13 </div> 14 <div class='chat-room-form__field'> 15 <div class='chat-room-form__field--left'> 16 <label class='chat-room-form__label' for='chat_room_チャットメンバー'>チャットメンバー</label> 17 </div> 18 <div class='chat-room-form__field--right'> 19 <select name="room[user_ids][]"> 20 <option value="">チャットするユーザーを選択してください</option> 21 <% User.where.not(id: current_user.id).each do |user| %> 22 <option value=<%= user.id %>><%= user.name %></option> 23 <% end %> 24 </select> 25 <input name="room[user_ids][]" type="hidden" value=<%= current_user.id %>> 26 </div> 27 </div> 28 <div class='chat-room-form__field'> 29 <div class='chat-room-form__field--left'></div> 30 <div class='chat-room-form__field--right'> 31 <%= f.submit class: 'chat-room-form__action-btn'%> 32 </div> 33 </div> 34 <% end %> 35</div> 36

user.rb

class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable with_options presence: true do validates :name validates :status_id validates :group_id validates :password_confirmation end extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :group belongs_to :status has_many :room_users has_many :rooms, through: :room_users end

room.rb

class Room < ApplicationRecord has_many :room_users has_many :users, through: :room_users end

room_user.rb

class RoomUser < ApplicationRecord belongs_to :room belongs_to :user end

rooms_controller.rb

class RoomsController < ApplicationController def new @room = Room.new end def create @room = Room.new(room_params) if @room.save redirect_to root_path else render :new end end private def room_params params.require(:room).permit(:name, user_ids: []) end end

routes.rb

Rails.application.routes.draw do devise_for :users root to: 'messages#index' resources :rooms, only: [:new, :create] resources :messages end

room_user.rbのマイグレーションファイル

class CreateRoomUsers < ActiveRecord::Migration[6.0] def change create_table :room_users do |t| t.references :user, foreign_key: true t.references :room, foreign_key: true t.timestamps end end end

試したこと

userモデルのactive_hashに関係するアソシエーションの上に中間テーブルとのアソシエーションを書いたりしてみたのですが結果は保存されず変わりませんでした。

補足情報(FW/ツールのバージョンなど)

rails 6.0.0を使用しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

関連を同時に登録するには modelでの宣言、viewの書き方、permitの書き方全部修正が必要です。accepts_nested_attributes_for で探してください。

もしくは、
@roomが出来た後で
@room.users = User.where(params[:room][:user_ids])

投稿2021/01/21 13:31

winterboum

総合スコア23329

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問