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

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

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

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

Q&A

1回答

2944閲覧

中間テーブルに値が入らない (バリデーションに失敗しました: Usersは不正な値です)

moto12

総合スコア15

Ruby on Rails

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

0グッド

0クリップ

投稿2020/10/28 02:36

編集2020/10/30 12:21

前提・実現したいこと

Railsでチャットアプリ(roomを作成し、その中で話す)を作っています。
解決したいことは、userとroomの中間テーブル(room_usersテーブル)に値が入ることです。

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

roomを作成する際に、roomに入れるuserも選択肢、中間テーブルにroom_idとuser_idを保存したい。
しかし、room作成ボタンを押した後、roomテーブルにのみ値が入っており、room_usersテーブル(中間テーブル)には
値が入っていない。

### 該当のソースコード

Rails

1【new.html.erb】 2class RoomsController < ApplicationController 3 4 5 def index 6 7 end 8 9 def new 10 @room = Room.new 11 @room.room_users.build 12 end 13 14 def create 15 @room = Room.new(room_params) 16 if @room.save 17 redirect_to root_path 18 else 19 redirect_to new_room_path 20 end 21 end 22 23 def destroy 24 room = Room.find(params[:id]) 25 room.destroy 26 redirect_to root_path 27 end 28 29 private 30 31 def room_params 32 params.require(:room).permit(:name, room_users_attributes:{user_ids:[]}) 33 end 34 35end 36

Rails

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>

Rails

1【room_users.rb(中間テーブル)】 2 3class RoomUser < ApplicationRecord 4 belongs_to :room, optional: true 5 belongs_to :user, optional: true 6end

Rails

1【user.rb】 2 3class User < ApplicationRecord 4 5 extend ActiveHash::Associations::ActiveRecordExtensions 6 7 devise :database_authenticatable, :registerable, 8 :recoverable, :rememberable, :validatable 9 10 belongs_to_active_hash :genre 11 belongs_to_active_hash :grade 12 belongs_to_active_hash :class_number 13 belongs_to_active_hash :number 14 15 has_many :room_users 16 has_many :rooms, through: :room_users 17 has_many :messages 18 accepts_nested_attributes_for :room_users 19 20 with_options presence: true do 21 validates :name 22 validates :email 23 validates :password 24 25 with_options numericality: { other_than: 1} do 26 validates :genre_id 27 validates :grade_id 28 validates :class_number_id 29 validates :number_id 30 end 31 end 32end

Rails

1【room.rb】 2 3class Room < ApplicationRecord 4 5 has_many :room_users 6 has_many :users, through: :room_users 7 has_many :messages, dependent: :destroy 8 accepts_nested_attributes_for :room_users 9 validates :name, presence: true 10end

Rails

1【ログ】 2 3Started POST "/rooms" for ::1 at 2020-10-30 21:19:38 +0900 4Processing by RoomsController#create as HTML 5 Parameters: {"authenticity_token"=>"29rqX0N8xw8O14Yoppch1Eu4jo+rGqHvvwQWeqjWLCbFCeHyK9RMsLsywC8WiRaZbQNh8cOAcOLY1UAuczVQ4Q==", "room"=>{"name"=>"test", "user_ids"=>["2", "1"]}, "commit"=>"登録する"} 6 User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 7Unpermitted parameter: :user_ids 8 (0.2ms) BEGIN 9 ↳ app/controllers/rooms_controller.rb:15:in `create' 10 Room Create (0.3ms) INSERT INTO `rooms` (`name`, `created_at`, `updated_at`) VALUES ('test', '2020-10-30 12:19:38.500111', '2020-10-30 12:19:38.500111') 11 ↳ app/controllers/rooms_controller.rb:15:in `create' 12 (1.9ms) COMMIT 13 ↳ app/controllers/rooms_controller.rb:15:in `create' 14Redirected to http://localhost:3000/ 15Completed 302 Found in 10ms (ActiveRecord: 2.8ms | Allocations: 5200) 16 17
更新日時:10月30日(金) 14:20

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

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

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

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

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

winterboum

2020/10/28 04:15

roomのnewのviewを載せてください
moto12

2020/10/28 05:11

載せました。ご確認お願いします。
winterboum

2020/10/28 08:17

したから 11行目の <input name="room[user_ids][]" type="hidden" value=<%= current_user.id %>> を削除
guest

回答1

0

model Roomには user_ids というcolumnがないのでそのエラーとなります。

name="room[user_ids][]" には2つ問題があります。
1)この name が select と hidden と2つに出てきています。後に出てくるhiddenが有効になり、paramsは常に空になるのではないかと思われます。
logでどうなっているか確認してください。⇒ hiddenは消す
2)name="room[user_ids][] のままでは自動的に中間fileを作ってもらえません。
対策1:roomができた後で、params[:room][user_ids]をloopして作ってください・
対策2:accepts_nested_attributes_for と 
なんとか_nested_attributes_for を調べてください

投稿2020/10/28 06:48

winterboum

総合スコア23329

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

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

moto12

2020/10/28 08:14

対策1の記述がよく分からないのですが、具体的にどのような記述になるのか教えて頂けますでしょうか。対策2などを反映させたファイルなどは、追加画面で載せますので、ご確認の必要があればどうぞ。
winterboum

2020/10/28 08:17

したから 11行目の <input name="room[user_ids][]" type="hidden" value=<%= current_user.id %>> を削除
winterboum

2020/10/28 08:19

「対策2などを反映させたファイルなどは、追加画面で載せます」ってどこだろう?
moto12

2020/10/28 08:23

今載せました!何度も確認頂き申し訳ございません、、、
winterboum

2020/10/28 09:51

accepts_nested_attributes_for はできてるんですが、  controllerのroom_paramsに 「なんとか_nested_attributes_for」が無いです。 logは GET / の一つ前に POST が有ると思うのだが。そこで無いと意味がない
moto12

2020/10/28 11:59

「なんとか_nested_attributes_for」というものが、調べながら色々と試して見たのですが、よく分からないのですが、何かヒントを頂けるとありがたいです(T_T)
winterboum

2020/10/28 14:07

params.require(:room).permit(:name, user_ids_attributes: []) おしい params.require(:room).permit(:name, room_users_attributes: {user_ids: [] })
moto12

2020/10/30 05:23

その部分の修正をしたのですが、変化はなかったのですが、他に見るべき点などございましたら教えて頂けませんか。(何度も質問してしまい大変心苦しいですが...)
winterboum

2020/10/30 11:56

log見せてください。 その時のcodeが掲載と違っていたら載せてください
moto12

2020/10/30 12:21

ログは上に載せているものが最新のものです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問