2

このチュートリアルでプロジェクトを Rails3 から Rails4 にアップグレードしていました: RailsCasts

私はモデルを持っています:

  class Test < ActiveRecord::Base
    validates :content, :presence => true, :length => { :minimum => 2 }
    validates :name, :presence => true,    :length => { :minimum => 2 }
    validates :value, :presence => true      
  end

アップグレード後、Rails コンソールで新しいテスト オブジェクトを作成しようとしました

   Test.create(name: "asd", content:"asd", value: 5)

そして得た

  WARNING: Can't mass-assign protected attributes for Achievement: name, content, value
  (0.2ms)  BEGIN
  (0.2ms)  ROLLBACK
=> #<Test id: nil, name: nil, content: nil, value: nil, created_at: nil, updated_at: nil> 

何かをアップグレードするのを忘れていたようです。設定ファイルやその他の Rails ファイルをオーバーライドして Rails アプリケーションを再作成しようとしましたが、何も変わりませんでした。

新しい空のプロジェクトを作成し、モデル ファイルをコピーしました。それは正常に動作していました。

私が追加する場合

config.active_record.whitelist_attributes = false

config/application.rb に、アップグレードされたプロジェクトが正常に動作します。しかし、空の rails4 では、この行が削除されているため、正常ではありません。

アップグレードするのを忘れたもの、またはアップグレードされたプロジェクトを空のように動作させるには、rails4 で config.activerecord を使用せずに作成する必要があります...?

UPD

raw_params = {:name => "asdasd", :content=>"asdasdasd", :value=>5} 
=> {:name=>"asdasd", :content=>"asdasdasd", :value=>5} 
2.0.0dev :002 > params = ActionController::Parameters.new(raw_params)
=> {"name"=>"asdasd", "content"=>"asdasdasd", "value"=>5} 
2.0.0dev :003 >  test = Test.create(params.permit(:name, :value, :content))
WARNING: Can't mass-assign protected attributes for Achievement: name, value, content
 (0.2ms)  BEGIN
 (0.2ms)  ROLLBACK
=> #<Test id: nil, name: nil, content: nil, value: nil, created_at: nil, updated_at: nil> 
4

1 に答える 1

1

Rails 4 では、attr_accessible一括代入チェックを行うために使用されなくなりました。一括代入とは、値のハッシュを渡すことによって Model オブジェクトを作成または更新する方法を指します。Rails 4 で一括代入を行う場合、許可するパラメーターと許可しないパラメーターを指定する必要があります。これはセキュリティ上の理由によるものです。

strong_parametersのリポジトリを見てください。Rails 4 で一括代入セキュリティがどのように機能するかについての簡単な説明が含まれています。特にUse Outside Of Controllers を見てください。

于 2013-07-07T10:37:53.630 に答える