シヨツ鬼のブログ

初心者向けに分かりやすくIT関連の情報を発信しています。

【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タブで指定した値の形式と異なっていると、今回のエラーが出てしまいます。

解決方法

それでは具体例をもとに解決方法を見ていきましょう。
僕が作ったアプリでは最初、このようなエラーが出ていました。

f:id:shiyotsuki:20201115221535p:plain

この時のcontrollerのソースはこんな感じです。

class RelationshipsController < ApplicationController
    def create
      current_user.active_relationships.create(create_params)
    end

    private

    def create_params
      params.permit(:following_id)
    end
end




ここで、もう一度、エラーを見直してみましょう。
f:id:shiyotsuki:20201115183426p:plain

この青で囲った部分より、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





まとめ

僕はこのエラーと半日かけて戦いました。。。
結構しょうもないエラーだと思うので、この記事が少しでも助けになったなら幸いです。
最後まで読んでくれてありがとう。
参考になったら「☆」を押してね。
TwitterYouTubeもよろしくね!