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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

11608閲覧

UnpermittedParametersに苦しんでいます。(rails)

yamady

総合スコア176

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2017/08/14 12:47

編集2017/08/15 08:19

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

Ruby on Rails 5.0.0.1で口コミサイトを開発しています。
ユーザーに紐付いた口コミが更新されずに困っています。
「パラメーターがない!」とエラーで指摘を受けているのですが、実際、createしているときと同じものをいれているので間違いないはずなのですが・・・

Ruby

1app[web.1]: Completed 500 Internal Server Error in 7ms (ActiveRecord: 1.7ms) 2app[web.1]: ActionController::UnpermittedParameters (found unpermitted parameter: id): 3app[web.1]: app/controllers/reviews_controller.rb:54:in `create_params' 4app[web.1]: app/controllers/reviews_controller.rb:20:in `update'

##ソースコード

reviewモデル

Ruby

1class Review < ApplicationRecord 2 belongs_to :user 3 belongs_to :product 4 has_one :review_image 5 accepts_nested_attributes_for :review_image 6 7 default_scope -> { order(created_at: :desc) } 8 validates :user_id, presence: true 9 validates :product_id, presence: true 10 validates :content, presence: true, length: { minimum: 200 } 11end

すみませんが、どうぞ宜しくお願いします。

##追記

Ruby

1 <div class="review-edit"> 2 <%= form_for(@review) do |f| %> 3 <div class="post-rate"> 4 <div class="form-group"> 5 <label for="rate">評価</label> 6 <%= f.select :rate, {'1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5}, class: "form-control" %> 7 </div> 8 </div> 9 <div class="post-contents"> 10 <div class="form-group"> 11 <label for="textarea">口コミを入力</label> 12 <%= f.text_area :content, class: "form-control", placeholder: "口コミ内容", rows: "10", onKeyUp: "countLength(value, 'textlength')" %> 13 <p>現在<span id="textlength">0文字</span></p> 14 </div> 15 </div> 16 <div class="post-photo"> 17 <div class="form-group"> 18 <label for="review_image">画像を投稿</label> 19 <%= f.fields_for :review_image do |review_image| %> 20 <%= review_image.file_field :image %> 21 <% end %> 22 </div> 23 </div> 24 <%= f.submit "更新する", class: "btn" %> 25 <% end %> 26 </div>

##追記エラー

heroku[router]: at=info method=POST path="/reviews/114" dyno=web.1 connect=1ms service=32ms status=500 bytes=1827 protocol=http app[web.1]: Started PATCH "/reviews/114" for 108.162.246.164 at 2017-08-15 08:12:08 +0000 app[web.1]: Processing by ReviewsController#update as HTML app[web.1]: Parameters: {"utf8"=>"✓", "authenticity_token"=>"R+GNVKUKE/9SPW4ULsVptV7C6bVw==", "review"=>{"rate"=>"5", "content"=>"口コミが入ります。", "review_image_attributes"=>{"id"=>"20"}}, "commit"=>"編集する", "id"=>"114"} app[web.1]: Review Load (1.9ms) SELECT "reviews".* FROM "reviews" WHERE "reviews"."id" = $1 ORDER BY "reviews"."created_at" DESC LIMIT $2 [["id", 114], ["LIMIT", 1]] app[web.1]: Completed 500 Internal Server Error in 6ms (ActiveRecord: 1.9ms) app[web.1]: ActionController::UnpermittedParameters (found unpermitted parameter: id): app[web.1]: app/controllers/reviews_controller.rb:55:in `create_params' app[web.1]: app/controllers/reviews_controller.rb:33:in `update'

reviewコントローラー

class ReviewsController < ApplicationController before_action :set_review, only:[:show, :edit, :update, :destroy] before_action :correct_user, only: [:edit, :destroy] def create @review = current_user.reviews.create(create_params) if @review.save flash[:success] = "口コミが投稿されました!" redirect_to root_path else flash[:alert] = "口コミの投稿に失敗しました。" redirect_to root_path end end def new @product = Peroduct.find(params[:id]) if signed_in? @review = current_user.reviews.build @review.build_review_image else redirect_to new_user_registration_path end end def show end def edit end def update if @review.update_attributes(create_params) flash[:success] = "口コミが更新されました" redirect_to @review else flash[:alert] = "口コミの編集に失敗しました。" render 'edit' end end def destroy @review.destroy flash[:success] = "口コミが削除されました" redirect_to request.referrer || root_url end private def set_review @review = Review.find(params[:id]) end def create_params params.require(:review).permit(:id, :content, :rate, :title, :product_id, :user_id, review_image_attributes: [:image]) end def correct_user @review = current_user.reviews.find_by(id: params[:id]) redirect_to root_url if @review.nil? end end

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

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

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

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

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

gouf

2017/08/14 20:08

たとえば pry を用いてブレークポイントを仕掛け、プログラムの動作を追ってみましたか?(特にparams の内容など) : [今更聞けないpryの使い方と便利プラグイン集 - Qiita](http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f)
yamady

2017/08/15 08:20

ありがとうございます!やってみます!pryマスターできてなかったので、勉強し直すようにします。。。
guest

回答1

0

ベストアンサー

params.require(:review).permit(:id, :content, :rate, :title, :product_id, :user_id, review_image_attributes: [:image])

:idはURLに含まれているはずですので、フォーム経由のパラメータとして渡されるべきではありません。


コメントだと追いかけられないのでこちらにも書いておきますが、ネストされたreview_image_attributesの方に:idがないのでここで引っかかってます。作成の時はなくても動くのですが、更新の時は:idが必要になります。

投稿2017/08/14 21:19

編集2017/08/15 23:57
suzukis

総合スコア1449

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

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

yamady

2017/08/15 05:14

suzukisさま、ご回答いただきましてありがとうございます。 ローカル環境ではうまくいっているのですが、本番環境で同じ文言でやはりエラーになてしまいます。 def create_params params.require(:review).permit(:content, :rate, :title, :product_id, :user_id, review_image_attributes: [:image]) end found unpermitted parameter: idと出てしまうのですが、これは product_idやuser_idもはずさければならないということなのでしょうかね。。
chelsy7110

2017/08/15 05:29

UnpermittedParametersのエラーですが、permitに余計なものが入っているかどうかではありません。 formから送られてきたparamsにpermitに入っていないものが入っていた場合に出るエラーです。 formがどうなっているかコードを追記してもらえますでしょうか?
suzukis

2017/08/15 05:38

`config.action_controller.action_on_unpermitted_parameters = :raise`を設定していないと不正なパラメータは無視されます。ローカルと本番でこの差がないでしょうか。いずれにせよ、idがパラメータとして飛んできている時点でおかしいので、フォームを修正してください。
yamady

2017/08/15 06:50

みなさま、ありがとうございます。 なるほど、ビューでいらないidが送信されてしまっていたということですね(*_*) このあたり、変なものは渡されていないはずなんですが。。。涙
suzukis

2017/08/15 07:40

あれ。おかしなものなさそうですね。そうなるとちょっとややこしいです。 ・コントローラのソースとエラーメッセージの行数が一致してません。 ・コンソールまたはログに送信されたパラメータが書いてあるはずです このあたり質問の追記修正をお願いします。
yamady

2017/08/15 08:20

エラーメッセージとコントローラ、およびパラメータを追記いたしました。。汗
chelsy7110

2017/08/15 11:27 編集

あああああああ! review_image_attributesの方に:idがないですね。strong parametersのところに足してみてください。それで解決すると思います。 fields_forでやった場合、見えないですがidが送られるんですよ。
yamady

2017/08/15 11:42

おおおおおお! できました!!(感動)strong parametersまだ完全に理解しきれてないですね、、よくここミスが多いので、しっかりとやらなければ。。 chelsy7110さん、suzukisさん、goufさん、本当にありがとうございました。!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問