将Rails 3.2升级到Rails 4和Params

时间:2013-07-07 09:46:51

标签: ruby-on-rails-4

我使用本教程将我的项目从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> 

1 个答案:

答案 0 :(得分:1)

在Rails 4中,attr_accessible不再用于进行质量分配检查。质量赋值是指通过传递值的散列来创建或更新Model对象的做法。在Rails 4中进行批量分配时,必须指定允许哪些参数以及哪些参数不允许。这是出于安全原因。

查看strong_parameters的存储库,它包含Rails 4中大规模分配安全性如何工作的简要说明。特别要看在控制器之外使用