我有一个模型A
,例如:
class A < ActiveRecord::Base
validates_uniqueness_of :name
attr_accessible :name
end
我想删除属性:name
上的质量分配漏洞。所以我从这个模型中删除了行attr_accessible :name
。这个模型没有控制器,所以我没有写任何强参数。该模型用于帮助器B.rb
,如下所示:
num_users = A.where(:name => "NEW").count
我是否需要以任何方式更改此行,或者在我从模型中删除attr_attributed :name
后此行仍然有效?
答案 0 :(得分:1)
它会正常工作,质量分配保护只有在你指定质量时,即。你一次分配了很多属性(例如。A.create(params)
),并且只有当你使用进入控制器的params
时才会这样做。在使用您创建的哈希进行批量分配时,您不会遇到此问题。
答案 1 :(得分:1)
首先,无论是否使用质量分配,此行num_users = A.where(:name => "NEW").count
都能正常工作。这是因为where
方法不会将数据分配给模型记录。
另一方面,很少见到ruby-on-rails-4和质量分配标签的问题(两者都只有7个)。
这是因为Rails 4删除了mass_assignment并将其替换为strong_parameters,您可以在rails guides upgrade to 4.0找到它。
如果行attr_accessible :name
在rails 4 app上运行正常。然后你必须在你的Gemfile上有protected_attributes gem。
必须有充分的理由将protected_attributes gem添加到Rails 4应用程序。如果没有,您可以从Gemfile中删除do bundle install并从模型中删除所有attr_accessible ...
行。并且还从模型的操作中删除:without_protection => true
参数(new,create,create!,update_attributes和update_attributes!,assign_attributes)。
如果你将gem protected_attributes保留在Gemfile中。然后,当您需要更新某些不是attr_accessible
的字段时,您必须在操作中添加参数without_protection: true
。这样:
A.create({name: 'NEW'}, without_protection: true)
记录将存储在数据库中。否则它将无法工作。