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

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

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

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

Q&A

解決済

1回答

549閲覧

DBに保存ができない

kenta34344

総合スコア5

Ruby on Rails

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

0グッド

0クリップ

投稿2021/12/20 11:55

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

なし(render :new)にて保存できず戻ってしまう。

該当のソースコード

ordercontroller

1class OrdersController < ApplicationController 2 3 def index 4 @orders = Order.all 5 end 6 7 def new 8 @order = Order.new 9 end 10 11 def create 12 @order = Order.new(order_params) 13 if @order.save 14 redirect_to_root_path 15 else 16 render :new 17 end 18 end 19 20 private 21 22 def order_params 23 params.require(:order).permit(:order_content).merge(user_id: current_user.id) 24 end 25end 26

ordermodel

1class Order < ApplicationRecord 2 belongs_to :user 3 4 validates :order_content, presence: true 5 6end

usermodel

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 7 has_many :orders 8end

newhtml

1<%= form_with model: @order, local: true do |f| %> 2 <div class="fild"> 3 <%= f.label :content, "注文内容" %><br /> 4 <%= f.text_area :content %> 5 </div> 6 <div class="actions"> 7 <%= f.submit "注文する", class: :send %> 8 </div> 9 <% end %>

試したこと

def create
@order = Order.new(order_params)
binding.pryで止めparamsを見るとorder_contentしかなくuser_idが送られていないようです。アソシエーションやparamsにミスは無いように見えますがどこが間違っていますか?

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

一般論として、params(が返す値)は、Hashと似ていますが、同じではありません。
Controller の、

ruby

1def order_params 2 params.require(:order).permit(:order_content).merge(user_id: current_user.id)

の文において、:order_content:orderしかpermitあるいはrequireしていない以上、user_idは正当な値として見做されないでしょう。そこで蹴られることになりましょう––そしてこれについてはエラーは出ないはずです。

試していませんが、Controller において、

ruby

1def create 2 @order = Order.new(order_params.to_h.merge(user_id: current_user.id))

とすれば動くのでは、と期待します。もしくは、

ruby

1 @order = Order.new(user_id: current_user.id, **(order_params.to_h))

とすれば、意味的により明確でしょうか(to_hは不要かも知れません)。

投稿2021/12/20 15:15

MasaSakano

総合スコア188

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問