🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 6

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

保存

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

Q&A

1回答

1172閲覧

入力した値をそれぞれのDBに保存させたい

ringo0820

総合スコア0

Ruby on Rails 6

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

保存

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

0グッド

0クリップ

投稿2020/12/12 03:21

rails初心者です。
現在架空のアパレルサイトを制作しており、
その中でログインユーザーと既存のスタッフ間でチャットが出来る機能を実装しようと考えております。
新規チャット名を入力とチャットしたいスタッフ名を選んでCreate Roomボタンを押すと
以下のエラーメッセージが発生しました。
Parametersには値が入っているのでrooms_controller.rb内のparamsの記述が誤っているのでは無いかと推測していますが実際にどのような記述をして良いかわかりません。
どなたかご指導のほどよろしくお願いいたします。

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

ActiveModel::UnknownAttributeError in RoomsController#create unknown attribute 'user_id' for Room.

ターミナル内

app/controllers/rooms_controller.rb:7:in `create' Started POST "/rooms" for ::1 at 2020-12-12 11:52:50 +0900 Processing by RoomsController#create as HTML Parameters: {"authenticity_token"=>"pRXXcKRl1rYLD2Fuieu2vjGFvGBYbPtPI/KcfSHZZORSkJhHrq+m3bSq3a+cLeauQ47wNch2yIkd+8OG0EmEOQ==", "room"=>{"name"=>"新規チャット", "staff_id"=>["risa"], "user_id"=>["3"]}, "commit"=>"Create Room"} Unpermitted parameter: :staff_id Completed 500 Internal Server Error in 3ms (ActiveRecord: 0.0ms | Allocations: 1110) ActiveModel::UnknownAttributeError (unknown attribute 'user_id' for Room.):

該当のソースコード

html

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 class='chat-room-form__field--left'> 14 <label class='chat-room-form__label' for='chat_room_チャットメンバー'>スタッフ</label> 15 </div> 16 <div class='chat-room-form__field--right'> 17 <select name="room[staff_id][]"> 18 <option value="">チャットするスタッフを選択してください</option> 19 <% Staff.all.each do |staff| %> 20 <option><%= staff.staff_name %></option> 21 <% end %> 22 </select> 23 <input name="room[user_id][]" type="hidden" value=<%= current_user.id %>> 24 </div> 25 </div> 26 <div class='chat-room-form__field'> 27 <div class='chat-room-form__field--left'></div> 28 <div class='chat-room-form__field--right'> 29 <%= f.submit class: 'chat-room-form__action-btn'%> 30 </div> 31 </div> 32 <% end %> 33</div>

Roomscontroller

1class RoomsController < ApplicationController 2 def new 3 @room = Room.new 4 end 5 6 def create 7 @room = Room.new(room_params) 8 if @room.save 9 redirect_to root_path 10 else 11 render :new 12 end 13 end 14 15 private 16 17 def room_params 18 params.require(:room).permit(:name, user_id: []).merge(staff_id: []) 19 end 20 21end
roomsテーブル |id|name|created_at|updated_at| |:--|:--:|--:| |||| staffsテーブル |id|staff_name|created_at|updated_at| |:--|:--:|--:| |||| room_staffsテーブル |id|room_id|user_id|staff_id|created_at|updated_at| |:--|:--:|--:| ||||

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

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

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

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

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

guest

回答1

0

Room に user_id というカラムがないのに create の new で 指定してしまってます。

ruby

1def create 2 @room = Room.new(room_params) 3 4def room_params 5 params.require(:room).permit(:name, user_id: []).merge(staff_id: [])

staff_id というカラムもないので消しましょう。
(merge(staff_id: []) と書くと、常に空の staff_id が追加されちゃいます)

ruby

1def room_params 2 params.require(:room).permit(:name)

これで room は作成されるはずです。

おそらく、user_id と staff_id、room_id を使って room_staffs も作成されたいのだと思います。
rails には子モデルも一気に作れる accepts_nested_attributes_for というのがあります。
ここでは詳しく説明できませんが、参考になりそうな記事を貼っておきます。

fields_forの上手な使い方
accepts_nested_attributes_forについて学ぶ

current_user.id をビューに埋め込むのはやめましょう。
コントローラーでcurrent_user.idとすれば良いだけですし、フォームから受け取る値は改竄されたものである恐れがあります。

投稿2020/12/12 05:24

neko_daisuki

総合スコア2090

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

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

ringo0820

2020/12/12 10:19

neko_daisuki様 コメントいただきありがとうございます。 参考記事も拝見させていただきました。 ちょっと私には難しくて…改めて挑戦してみます。 ``` def room_params params.require(:room).permit(:name) ``` こちら試してみましたが、作成されませんでした。 roomsテーブルにnameカラムに加え、user_idカラムとstaff_nameカラムを追加しこちらに保存出来るようにしました。 ``` def room_params params.require(:room).permit(:name, :user_id, :staff_name) end ``` paramsも変更しましたが、DBに保存されませんでした。 binding.pryで停止させました。 ``` 6: def create 7: @room = Room.new(room_params) => 8: binding.pry 9: if @room.save 10: redirect_to root_path 11: else 12: render :new 13: end 14: end [1] pry(#<RoomsController>)> params => <ActionController::Parameters {"authenticity_token"=>"Ee/7Nml0I8MmUcL3RK6DRUMC9jkb+tVw76JdY2+vm4rmarQBY75TqJn0fjZRaNNVMQm6bIvg5rbRqwKYnj97Vw==", "room"=><ActionController::Parameters {"name"=>"新規チャット", "staff_name"=>"ayu", "user_id"=>"3"} permitted: false>, "commit"=>"Create Room", "controller"=>"rooms", "action"=>"create"} permitted: false> [2] pry(#<RoomsController>)> @room => #<Room:0x00007fee12c7df28 id: nil, name: "新規チャット", user_id: 3, staff_name: "ayu", created_at: nil, updated_at: nil> [3] pry(#<RoomsController>)> @room.save => false ``` 値が入っていますが、@room.saveでfalseになっていました。 どこが間違っておりますでしょうか?
neko_daisuki

2020/12/12 17:00

[3] pry(#<RoomsController>)> @room.save のあとに @room.errors と入力するとどのバリデーションに引っかかったのか確認できます。 あと def room_params は以下のようにしましょう。 params.require(:room).permit(:name, :staff_name) .merge(user_id: current_user.id) current_user.id を取得するのにフォームから受け取った値を使うのはやめましょう。
ringo0820

2020/12/13 01:45

何度もコメントいただきありがとうございます。 def room_params は以下のようにしましょう。 params.require(:room).permit(:name, :staff_name) .merge(user_id: current_user.id) current_user.id を取得するのにフォームから受け取った値を使うのはやめましょう。 ↑ こちらのviewでの記述方法はどのようにしたら宜しいでしょうか? models/room.rbにバリデーションを記述しましたが直りませんでした。 validates :user, presence: true validates :staff, presence: true エラー内容 RoomsController#create: 6: def create 7: @room = Room.new(room_params) => 8: binding.pry 9: if @room.save 10: redirect_to root_path 11: else 12: render :new 13: end 14: end [1] pry(#<RoomsController>)> params => <ActionController::Parameters {"authenticity_token"=>"m+b3eWpkeUS2fQNArC1VujBCAxO3vDBTeAZ+7Pox4cpsY7hOYK4JLwnYv4G56wWqQklPRiemA5VGDyEXC6EBFw==", "room"=><ActionController::Parameters {"name"=>"新規チャット3", "staff_name"=>"ayu", "user_id"=>"3"} permitted: false>, "commit"=>"Create Room", "controller"=>"rooms", "action"=>"create"} permitted: false> [2] pry(#<RoomsController>)> @room.save => false [3] pry(#<RoomsController>)> @room.errors => #<ActiveModel::Errors:0x00007f88a5a06ba0 @base= #<Room:0x00007f88a594dc40 id: nil, name: "新規チャット3", user_id: 3, staff_name: "ayu", created_at: nil, updated_at: nil>, @details= {:staff=>[{:error=>:blank}, {:error=>:blank}], :user=>[{:error=>:blank}, {:error=>:blank}]}, @messages= {:staff=>["must exist", "can't be blank"], :user=>["must exist", "can't be blank"]}>
neko_daisuki

2020/12/13 02:02

以下の部分を削除すれば良いです。 <input name="room[user_id][]" type="hidden" value=<%= current_user.id %>> {:staff=>["must exist", "can't be blank"], :user=>["must exist", "can't be blank"]}> staff と user が空なので保存されません。 追加したバリデーションが効いてます validates :user, presence: true validates :staff, presence: true
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問