0

我有一个带有虚拟属性的模型:

class Campaign < ActiveRecord::Base  
  def status
     if deactivated
       return "paused"
     else
       return "live"
     end
  end
end

现在,在我看来,当我使用 访问属性时campaign.status,我得到了正确的结果。但是,当我尝试像这样访问它时campaign[:status],我什么也得不到。

这是为什么?

4

1 回答 1

2

[:status] 使用 Ruby 中的 [] 方法。'def status' 定义了一个不应与 ActiveRecord 属性或虚拟属性(例如 attr_reader 或 attr_accessor)混淆的方法。ActiveRecord 将 [] 方法添加到您的类中,并使所有(数据库)属性可由 object[:attr_name] AND object.attr_name(甚至 object.attributes[:attr_name])访问。

这与 fe Javascript 的工作方式不同,其中 obj[:method] 与 obj.method 几乎相同。

编辑:如果您以任何形式使用 attr_accessor,您应该能够使用它们:

<%= form.input :status %>

然后提交表单将设置实例变量@status。如果你想在保存之前或之后对此做任何事情,你可以调用 before_save 或 after_save 钩子:

class Campaign < ActiveRecord::Base  
  attr_accessible :status
  attr_accessor :status
  before_save :raise_status

  def raise_status
    raise @status
  end
end

这将与状态的提交值一起引发错误。

希望这可以帮助。

于 2013-02-12T23:32:08.807 回答