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

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

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

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

Q&A

解決済

1回答

7583閲覧

Railsのupdateアクションでデータの更新がされない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2019/06/17 05:12

編集2019/06/17 05:50

前提・実現したいこと

閲覧いただきありがとうございます。

Railsでレビューサイトを作っています。
productにひもづくreviewの編集をしたいのですがうまくいきません。

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

エラーは出ておらず、editアクション、updateアクション共に呼ばれ、ビューも呼ばれています。
編集フォームに入力しトップに戻ることができますが、カラムの値が更新されていません。
createとdestroyは正常に動きます。

該当のソースコード

reviews_controller.rb

Ruby

1 def edit 2 @review = Review.find(params[:id]) 3 end 4 5 def update 6 review = Review.find(params[:id]) 7 review.update(review_params) if current_user.id == review.user_id 8 end 9 10 private 11 def review_params 12 params.require(:review).permit(:text).merge(product_id: params[:product_id], user_id: current_user.id) 13 end

edit.html.haml

haml

1 = form_for (@review) do |f| 2 .form__text 3 = f.text_area :text, placeholder: @review.text 4 .form__buttom 5 = f.submit "更新する"

routes.rb

Ruby

1Rails.application.routes.draw do 2 devise_for :users 3 resources :users, only: :show 4 resources :reviews, except:[:new, :create] 5 resources :products, only:[:index, :show] do 6 resources :reviews, only:[:new, :create] 7 end 8 root 'reviews#index' 9end

↑newとcreateのみproductにネストさせています(これがいけない?)
はじめは全部ネストさせていたのですが、editもネストさせるとidが二つ(/products/:product_id/reviews/:id)のようになり
link_toなどでprefixに引数を渡しても先頭の:idにしか反映されなかったので、
editはそもそもproductにネストさせる必要ないかなーと思いこのようにしました。

↓ちなみに、new.html.haml

haml

1= form_for [@product, @review] do |f| 2 .form__text 3 = f.text_area :text 4 .form__buttom 5 = f.submit "投稿する"

newとcreateはこれでうまくいっています。

試したこと

updateアクションでbinding.pry

{"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"pyTs75BIVj8bu7t9lyDJd/6n6pZOFb93dRUADR0+/2KGlJD5wKxagKMtFr0T3eU32/YX/7rNolaHzBokCyqRNw==", "review"=><ActionController::Parameters {"text"=>"初投稿〜\r\n編集後"} permitted: false>, "commit"=>"更新する", "controller"=>"reviews", "action"=>"update", "id"=>"12"} permitted: false>

ruby 2.5.1

paramsはきちんと渡っていると思うので、なぜうまくいかないか分かりません。
宜しくお願い致します。

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

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

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

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

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

Mugheart

2019/06/17 05:45

> はじめは全部ネストさせていたのですが、editもネストさせるとidが二つ(product/:id/review/:id)のようになり /products/:product_id/reviews/:id のようになりませんか...?普通はこうなるんですが...。 Rails.application.routes.draw do resources :products, only:[:index, :show] do resources :reviews end end $ rails routes | grep reviews product_reviews GET /products/:product_id/reviews(.:format) reviews#index POST /products/:product_id/reviews(.:format) reviews#create new_product_review GET /products/:product_id/reviews/new(.:format) reviews#new edit_product_review GET /products/:product_id/reviews/:id/edit(.:format) reviews#edit product_review GET /products/:product_id/reviews/:id(.:format) reviews#show PATCH /products/:product_id/reviews/:id(.:format) reviews#update PUT /products/:product_id/reviews/:id(.:format) reviews#update DELETE /products/:product_id/reviews/:id(.:format) reviews#destroy
退会済みユーザー

退会済みユーザー

2019/06/17 05:51

失礼致しました、仰る通りです。 質問を修正しました。 ご指摘頂きありがとうございます!
Mugheart

2019/06/17 05:58

直接reviewのIDでeditにアクセスしているなら問題ないはずなので もしかするとproductのidでreviewを検索していませんか?
Mugheart

2019/06/17 08:38

if current_user.id == review.user_id の部分が true になってないのかもしれないですね デバッグして確認してみてください
退会済みユーザー

退会済みユーザー

2019/06/17 12:12

デバックしてみましたが、こちらも問題なくidが渡っていました。 editアクションもネストさせてやってみようかと思います。
guest

回答1

0

ベストアンサー

結局editもネストさせ、/products/:product_id/reviews/:idの状態でidを双方に渡したらupdateできました。

色々とご教授頂いて有難うございました!

投稿2019/06/17 12:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問