黑客攻击attr_accessible以支持创建和更新的一组不同的可访问属性

时间:2009-12-30 23:38:51

标签: ruby-on-rails ruby activerecord

我正在试图弄清楚如何在我的代码中为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用户:

  1. 现在有一种方法可以忽略我作为Ruby / Rails的新手吗?
  2. 如果支持此功能,您会发现此功能有用吗?
  3. 您更喜欢哪种语法:
    1. attr_accessible_update和attr_accessible_create
    2. attr_accessible:update =&gt; [],:create =&gt; []
    3. 支持两者,伙计!
  4. 我应该把它变成宝石吗?
  5. 如果你知道在使用attr_accessible / attr_protected值的new / create / update / build期间清理参数的位置,那么如果你能指出它就会很好。
  6. 谢谢!

2 个答案:

答案 0 :(得分:0)

ActiveRecord有attr_readonly方法可以满足你的需要。

答案 1 :(得分:0)

我很确定目前不存在这种功能。

如果你继续尝试将其作为一个宝石实现,我可能会更喜欢你提出的#2语法。现在作为一般规则,您只能在模型中使用attr_protected或attr_accessible,并且不能混用它们。添加更多attr_ *语句可能会让人感到困惑。

你应该把它作为宝石实现吗?为什么不?把别的东西放在那里至少你觉得有帮助没什么坏处。

对不起,我对你的最后一点不能帮助你。 :)