...

【Rails】ActiveModel::ForbiddenAttributeとエラーが出た時の対処法

RailsのActiveModelのエラー

どうもおはようポテト(@ohayoupoteto22)です。

先日、Railsを利用している際に…

Active model::ForbiddenAttributesError」というエラーに遭遇したので、備忘録も兼ねてその際の解決に至るまでの方法やら何やらをまとめたいと思います

ブログ主

早速いってみよう!

環境

Ruby 2.65

Rails 5.23

経緯

def create
  @lesson=Lesson.new(params[:lesson])
  if @lesson.save
    flash[:notice]="授業を追加しました"
    redirect_to("/lessons")
  else
    flash[:notice]="追加できませんでした。"
    render("lesson#new")
  end
end

lessons_controller.rbというコントローラーのcreateアクション実行時にエラーが起きました。

 

この行に関して怒られています。

 

…なんか間違ってる??

 

…カンガエテモワカラナイ(›´ω`‹ )

ブログ主

ということで参考書に助けを請いました

解決法

まずは結論から

def create
  @lesson=Lesson.new(lesson_params)
  if @lesson.save
    flash[:notice]="授業を追加しました"
    redirect_to("/lessons")
  else
    flash[:notice]="追加できませんでした。"
    render("lesson#new")
  end
end

def lesson_params
  params.require(:lesson).permit(:name,:teacher,:classroom_id)
end

lesson_paramsというメソッドを用意し、それをnewの引数内で呼び出したところ、無事エラーは起きずレコードも保存されました。

とりあえず解決!

ソロモン

なぜエラーが起きたのか

@lesson=Lesson.new(params[:lesson])

この場合だと、確かに「lesson」というハッシュが渡されるのですが、第三者が勝手にそのハッシュ内で予期しないカラムのデータを編集できてしまう可能性があると。

StrongParameters

そもそも「params.require(〇〇).permit(〇〇)」とはなんぞやって話ですよね
ざっくり説明すると…

 

使い方

params.require(モデル).permit(取得したいカラム)

require→そのモデルのキーの値を返す
permit→指定したカラムのキーだけのハッシュを返す

 

permitメソッドを使うことによって指定したキーだけを取得することができるので、上で述べた危険性も無くなり、エラーも起きなくなると…

def lesson_params
  params.require(:lesson).permit(:name,:teacher,:classroom_id)
end

ブログ主

ふむふむ
参考 【Ruby on Rails】ストロングパラメータって何なの?Qiita

Railsのバージョンによる

調べてみたところ、どうやらRails3以前までだったらrequireやpermitを使わなくてもエラーにはならず、それ以降だとエラーが起きるようです。

最後に

以上になります

「あれ?前はこの書き方でエラー起きなかったのに…」となったのはRailsのバージョンが前と違かったからでした…

ブログ主

とほほ…

参考になれば幸いです!では⸝⸝- ̫ -⸝⸝

参考になったらシェアしよう

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA