【rails】「unpermitted parameters utf8 authenticity_token」のエラーでrollbackしまくって困っている君へ
どうも、プログラミングの鬼シヨツ鬼です。
最近railsを勉強がてら、あるアプリケーション作りに励んでいます。
この記事では「『unpermitted: :parameters: :utf8, :authenticity_token, relationship, :commit』というエラーが出て、rollbackが発生し、DBに全然登録できないぜ☆」っていうrails初心者の君に向けて、その解決方法をずばり解説しています。
原因
端的に言えば「controllerに書いたストロングパラメータの許可の設定値と、viewのformから送られてくるデータの形式に相違があるため」です。
ただ、これで分かる方はそもそもこの記事にたどり着いていないと思うので、もう少し詳しく説明します。
「controllerに書いたストロングパラメータの許可の設定値」とは、よくcontrollerのprivateに定義する「params.permit(:user_id)」みたいなやつのことです。
ここが、viewのformタブで指定した値の形式と異なっていると、今回のエラーが出てしまいます。
解決方法
それでは具体例をもとに解決方法を見ていきましょう。
僕が作ったアプリでは最初、このようなエラーが出ていました。
この時のcontrollerのソースはこんな感じです。
class RelationshipsController < ApplicationController def create current_user.active_relationships.create(create_params) end private def create_params params.permit(:following_id) end end
ここで、もう一度、エラーを見直してみましょう。
この青で囲った部分より、formからどのようなデータが送られてきているのか確認することができます。
ちょっと見やすく整理するとこんな感じです。
{ "utf8"=>"✓", "authenticity_token"=>"省略", "relationship"=>{ "folowing_id"=>"6", }, "commit"=>"いいね" }
このとき、controllerに書いたストロングパラメータをもう一度確認してみると、「params.permit(:following_id)」ですが、送られてきているデータはrelationshipの配下に入っているデータです。
なので、ソースをこのように書き換えます。
class RelationshipsController < ApplicationController def create current_user.active_relationships.create(create_params) end private def create_params params.require(:relationship).permit(:following_id) end end
助けられたサイト
この記事のおかげで僕は解決しました。
Ruby - [Rails5]ストロングパラメータでパラメーターを許可しているのにも関わらずUnpermitted parameters:が出てしまう。|teratail