【问题标题】:How to protect a Rails model attribute?如何保护 Rails 模型属性?
【发布时间】:2008-09-26 03:03:22
【问题描述】:

我的 Invoice 模型有一个 address_id 属性,我不希望这个 address_id 永远改变。所以我不希望这种情况发生在课外:

invoice.address_id = 1
invoice.address = some_address

Rails 会自动将此 address_id 属性从发票表添加到模型中,那么我如何声明此属性为私有/受保护的?调用

attr_protected :address_id

很可能不是解决方案,因为根据文档它只能防止批量分配。

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby model


    【解决方案1】:

    你想要attr_readonly

    【讨论】:

    • 这不会阻止 Rails 更新模型并将其保存回数据库吗?
    • 很好 - 不知道该方法存在 ;) @Gishu 不,我不认为它会阻止保存模型 - 它只会忽略对 *attributes 中列出的字段的更改
    • 此方法是否仅在 Rails 2.* 中可用?我在 Rails 1.2.6 中运行。
    • 不确定。查一下。如果不是,请添加它。 :)
    【解决方案2】:

    不像单行代码那么漂亮,但下面的代码应该可以工作(你总是可以做一些元编程来编写一个“不可变”的方法)

    def address_id=(id)
      if new_record?
        write_attribute(:address_id, id)
      else
        raise 'address is immutable!'
      end
    end 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      相关资源
      最近更新 更多