我在我的应用程序中遇到了一个问题,并意识到我可以通过在创建模型时设置:without_protection => true
来修复它,例如:
Model.new(params[:model], :without_protection => true).
导轨保护模型究竟是什么?谢谢!
答案 0 :(得分:16)
它可以防止非预期的质量分配。
您显示的代码的问题是,用户可以更改表单并更改您不希望他们更改的属性,例如用户的哈希密码或帖子上的已发布状态。
您可以在模型上使用attr_protected
和attr_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
在进行批量更新(new
或update_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