升级 Rails 3.2 到 Rails 4 和 Params
升级 Rails 3.2 到 Rails 4 和 Params
我正在根据这个教程将我的项目从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对象:
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 => #
看起来我忘记升级了某些东西。我尝试用新的配置文件和其他rails文件重新创建rails应用程序,但没有任何变化。
我创建了一个新的空项目并复制了模型文件,它可以正常工作。
如果我在config/application.rb中添加以下内容:
config.active_record.whitelist_attributes = false
我的升级项目将正常工作。但这并不正常,因为在空的rails4中,这行被删除了。
我忘记了升级什么或者我应该做什么,才能使升级后的项目像用rails4创建的空项目那样工作,而无需config.activerecord ...?
在Rails 4中,不再使用attr_accessible
来进行批量赋值检查。批量赋值是指通过传递一个值的哈希来创建或更新模型对象的做法。在Rails 4中进行批量赋值时,你必须指定允许哪些参数,哪些参数不允许。这是出于安全原因。
查看strong_parameters的存储库,它包含了有关Rails 4中批量赋值安全性如何工作的简要解释。特别注意在控制器之外使用。
在我创建的Rails 4应用程序中,这个批量赋值工作得很好。但是在从3.2升级到4.0的应用程序中,它不起作用。
我没有看到更新的帖子。谢谢。我会看一下在控制器之外使用。
2.0.0dev :001 > raw_parameters = { :name => "John", :content => "Dorrow" ,:value => 4 } => {:name=>"John", :content=>"Dorrow", :value=>4} 2.0.0dev :002 > params = ActionController::Parameters.new(raw_parameters) => {"name"=>"John", "content"=>"Dorrow", "value"=>4} 2.0.0dev :003 > params.class => ActionController::Parameters 2.0.0dev :004 > a = Test.create(params.permit(:name, :content, :value)) WARNING: Can't mass-assign protected attributes for Achievement: name, content, value oh lol.
解决方法是使用params.permit(:name, :content, :value)来指定允许的参数,以解决批量赋值的问题。