如果我在rails 3.1中创建新模型时使用:without_protection => true会发生什么?

时间:2011-11-17 22:05:26

标签: ruby-on-rails ruby-on-rails-3.1

我在我的应用程序中遇到了一个问题,并意识到我可以通过在创建模型时设置:without_protection => true来修复它,例如:

Model.new(params[:model], :without_protection => true). 

导轨保护模型究竟是什么?谢谢!

2 个答案:

答案 0 :(得分:16)

它可以防止非预期的质量分配。

您显示的代码的问题是,用户可以更改表单并更改您不希望他们更改的属性,例如用户的哈希密码或帖子上的已发布状态。

您可以在模型上使用attr_protectedattr_accessible来保护模型上的属性被覆盖。当属性受到保护时,将忽略来自params的值(通知将显示在您的日志中)。

class Model < ActiveRecord::Base
  attr_accessible :one, :two
end

在Rails 3.1之前,就是这样。之后无法配置它。现在,使用Rails 3.1,您可以分配角色:

class Model < ActiveRecord::Base
  attr_accessible :one, :two, :as => :admin
  attr_accessible :one, :as => :regular_user
end

在进行批量更新(newupdate_attributes)时指定它:

Model.new(params[:model], :as => :regular_user)

使用:without_protection,可以使每个属性都可以自由分配,并且应该非常谨慎地使用。传递用户数据时切勿使用。例如,您可以在db/seeds.rb中使用它。

答案 1 :(得分:1)

这可以保护您免受大规模分配。

假设您的模型看起来像这样:

class CreditCard
  belongs_to :user
end

您不希望有人会在creditcards_controller上调用您的更新操作并在params中传递另一个user_id属性[:credit_card]

您可以详细了解质量分配安全性here