升级 Rails 3.2 到 Rails 4 和 Params

18 浏览
0 Comments

升级 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 ...?

0
0 Comments

在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)来指定允许的参数,以解决批量赋值的问题。

0