我正在试图弄清楚如何在我的代码中为attr_accessible支持一个非常常见的用例,但实际上在查看attr_acessible和ActiveRecord :: Base源代码一段时间后,仍然不知道从哪儿开始。我可以在深入挖掘之后弄明白,但首先我想问一下是否有人会发现这个黑客有用,如果还有其他方法可以做到这一点,
以下是用例:
对于许多模型,在创建对象和更新对象时,通过质量分配应该可访问的属性是不同的。一个简单的示例是具有两个属性的用户模型:用户名和密码。刚刚创建对象时,我希望通过批量分配来访问用户名和密码。创建对象后,只能通过批量分配访问密码,因为不应该更改用户名。
当然我可以在我的控制器的create方法中手动设置对象的用户名,但我发现每个模型都会出现这种情况的某些版本。如果可以为创建和更新指定一组不同的attr_accessible属性,我可以继续使用我的标准restful new和create方法(例如,由inherited_resources提供)。此外我认为此信息属于模型。
所以我认为它可以起作用:
class User < ActiveRecord::Base
attr_accessible :password
attr_accessible_create :email
attr_accessible_update :bio
...
当创建对象时,可以通过批量分配访问密码和电子邮件。更新对象后,可通过批量分配访问电子邮件和生物。
这也可以通过attr_protected进行黑名单。与黑名单相同的例子:
class User < ActiveRecord::Base
attr_accessible :email, :password, :bio
attr_protected_create :bio
attr_protected_update :email
...
或者,语法可能更像这样:
attr_accessible :password, :create => [:email], :update => [:bio]
通过这些黑客攻击,您可以继续在控制器中使用User.update_attributes(params [:user])和User.new(params [:user]),并知道质量分配的内容得到了解决。如果您的控制器是由inherited_resources(严重影响并且不断变得更好)或resource_controller之类的东西创建的,那么您不必担心为这个简单的常见用例创建自定义控制器操作。
给我的问题,我的专家Rails用户:
谢谢!
答案 0 :(得分:0)
ActiveRecord有attr_readonly方法可以满足你的需要。
答案 1 :(得分:0)
我很确定目前不存在这种功能。
如果你继续尝试将其作为一个宝石实现,我可能会更喜欢你提出的#2语法。现在作为一般规则,您只能在模型中使用attr_protected或attr_accessible,并且不能混用它们。添加更多attr_ *语句可能会让人感到困惑。
你应该把它作为宝石实现吗?为什么不?把别的东西放在那里至少你觉得有帮助没什么坏处。
对不起,我对你的最后一点不能帮助你。 :)