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

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

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

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

630閲覧

【Rails5】form_withを使ったcreateアクションがうまくいきません。

taruya

総合スコア8

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/08/04 12:09

編集2018/08/04 12:34

初めて質問させて頂きます!

form_withを使って投稿詳細ページにレビューを入力するフォームを作ったのですが、createアクションがうまく行きません。

エラーログを見るとコントローラにパラメータは送信されているようなのですが、@review.saveの時にROLLBACKが起きている状態で、どこで問題が起きているかが分からず質問させて頂きました。

なお、planモデルとreviewモデル、及びuserモデルとreviewモデルにはそれぞれ一対多のアソシエーションを定義しており、reviewsテーブルには以下のカラムを挿入することを想定しています。

rate
review
user_id
post_id

以上、どなたかよろしくお願いします。

/reviews/_form.html.erb

<%= form_with(model: [ @plan, Review.new]) do |form| %> <div class="field"> <%= form.label :rate %> <%= form.number_field :rate %> </div> <div class="field"> <%= form.label :review %> <%= form.text_field :review %> </div> <div class="actions"> <%= form.submit %> </div> <% end %>

routes.rb

ails.application.routes.draw do devise_for :users resources :examples resources :users, only: [:show] resources :plans do resources :reviews, only: [:create, :update, :delete] #/plans/:plan_id/reviews(.:format) #Memo: 遷移先をplan_reviews_pathで指定 end # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root to: 'plans#index' # resource :mypage end

reviews_controller

class ReviewsController < ApplicationController before_action :set_review, only: [:create, :edit, :update, :destroy] (略) # POST /reviews def create @plan = Plan.find(params[:plan_id]) @review = Review.new(review_params) @review.user_id = current_user.id respond_to do |format| if @review.save format.html { redirect_to "plans/show", notice: 'レビューしました' } else format.html { render "plans/show" } end end end (略) private # Use callbacks to share common setup or constraints between actions. def set_review @review = Review.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def review_params params.require(:review).permit(:rate, :review).merge(user_id: current_user.id) end end

エラーログ

Started POST "/plans/10/reviews" for 10.0.2.2 at 2018-08-04 20:34:08 +0900 Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by ReviewsController#create as JS Parameters: {"utf8"=>"✓", "authenticity_token"=>"9pAqwwnPFKKynkPfR1EyIcRP6SEiSEoXFdxpIj/Fxmo2sVG1Kg9IMw2CIMUlGXImPvLO7JX+97w8q5lOSDjpeQ==", "review"=>{"rate"=>"5", "review"=>"tmp"}, "commit"=>"Create Review", "plan_id"=>"10"} Plan Load (0.3ms) SELECT `plans`.* FROM `plans` WHERE `plans`.`id` = 10 LIMIT 1 ↳ app/controllers/reviews_controller.rb:27 User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/controllers/reviews_controller.rb:73 (0.1ms) BEGIN ↳ app/controllers/reviews_controller.rb:31 User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 ↳ app/controllers/reviews_controller.rb:31 (0.5ms) ROLLBACK ↳ app/controllers/reviews_controller.rb:31 Rendering plans/show.html.erb within layouts/application Rendered reviews/_form.html.erb (4.2ms) Review Load (0.3ms) SELECT `reviews`.* FROM `reviews` WHERE `reviews`.`plan_id` = 10 ↳ app/views/plans/show.html.erb:42 Rendered plans/show.html.erb within layouts/application (41.7ms) Completed 200 OK in 456ms (Views: 431.8ms | ActiveRecord: 1.9ms)

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

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

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

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

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

takahashim

2018/08/04 14:15

post_idがコードに出てきてない気がするんですが、これは不要なんでしょうか? reviewモデルのコードも載せていただいた方が確実かもしれません。
taruya

2018/08/04 15:25

takahashimさん、レスポンスを頂きありがとうございます!post_idではなくplan_idでした。
guest

回答1

0

ベストアンサー

これだけだと、すぐに原因が分からないので、原因の切り分けをしたいです。
そのために、保存処理がそもそも動くのか確認したいですね。
bin/rails consoleで、以下のコードを実行したらどうなりますか?
saveではなく、save!を使う事でエラーがあれば例外が発生し、もう少し具体的なエラーが分かるかもしれません。
※userとplanはレコードがあるものとします

ruby

1review_params = { 2 rate:5, review: "tmp" 3} 4 5user = User.first 6plan = user.plans.first 7 8review = plan.reviews.new(review_params) 9review.user_id = user.id 10review.save!

これでエラーが起きずに保存されたらform_withのほうに何か原因があるのかもしれません。
form_withで1つ気になる事というと、
自分がform_with使うときは、オプションでlocal: trueを必ず指定しています。
詳細は忘れましたが、これを付けないとうまく動かない場合があって、それで指定するようにした記憶があります。

投稿2018/08/04 14:19

mingos

総合スコア4025

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

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

taruya

2018/08/04 15:23

ご回答ありがとうございます! save!に変えて試す事でvalidation errorがthrowされ、plan_idが渡されていない事が分かりました。そこでreviewsコントローラのcreate_paramsに以下のように書き加えることで無事解決できました。 .merge(user_id: current_user.id, plan_id: params[:plan_id]) エラー解決時の考え方やその過程・手法まで丁寧に説明して頂き、とても勉強になりました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問