QA@IT

Rails3.2.13 Can't mass-assign protected attributes エラー

3921 PV

基本的なエラーで申し訳ないのですが、
書籍「RailsによるアジャイルWebアプリケーション開発 第4版」に沿って作ったアプリで、
勉強のために色々といじっていました。

環境

  • ruby 1.9.3p429 (2013-05-15 revision 40747) [i686-linux]
  • passenger (4.0.5)

途中まで(一通り実装後)productsテーブルは問題なく更新されていたのですが、
どこかのタイミング(その操作が不明)で、表題のエラーがでるようになりました。

(Can't mass-assign protected attributes: title, description, image_url, price)

Productモデルは下記のように記述しています。

# encoding: utf-8
class Product < ActiveRecord::Base
  attr_accessible :title, :description, :image_url, :price

  has_many :line_items
  has_many :orders, through: :line_items
  • 「rails c」でのコンソールからもエラーが確認できます。
  • sqlite3で開発環境なのですが、mysqlに変更しても変わりません。
  • また「rake db:drop」でDBを作り直しても変わりません。

表題のエラーの原因としてはどのようなアプローチで調査すればよいでしょうか。
不足する情報があれば捕捉いたします。よろしくお願いいたします。

ちなみにその他のテーブルは問題なく更新されます。

回答

Mass assignment は ActiveRecord のレコードを作成する際に、Hash を引数に渡すことで属性をセットすることが出来る機能です。 Rails ですと controller の params を渡す用法が想定されています。

ただしユーザがセットしてはいけない属性、例えば管理者であることを示すフラグなどは、 mass assignment で設定を許しており、かつ、ユーザからの入力である params をそのまま渡す用法では問題があります。attr_accessible や attr_protected を使うと mass assignment を選択的に許可することができます。ユーザが書き換えても良いレコードは mass assignment OK, そうでないレコードは NG というふうに設定します。

エラーは、mass assignment 不能な属性に mass assignment を試みたために起きているものだと思います。Hash を引数にして Product の new, create, create!, update_attributes, update_attributes! を実行している箇所をチェックすれば良いと思います。

Mass assignment に関しては以下のURLを参照ください。
http://guides.rubyonrails.org/security.html#mass-assignment

編集 履歴 (0)
  • newメソッドの時点でエラーが出てます。。
    1.9.3-p429 :002 > p = Product.new(title: 'title')
    ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: title
    -

すいません。自己解決いたしました。
書籍のp389にて、Rackアプリケーション作成の際に、作成したファイルに下記の記述があり、
Productクラスの定義が重複しておりました。

申し訳ありません。お世話になりました。


class Product < ActiveRecord::Base
end

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。