在Ruby on Rails中访问虚拟属性的正确方法是什么?

时间:2013-02-12 23:21:50

标签: ruby-on-rails rails-activerecord

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

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

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

为什么?

1 个答案:

答案 0 :(得分:2)

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

这与f.e.不同。 Javascript适用于obj [:method]与obj.method几乎相同的地方。

编辑:如果你以任何形式使用attr_accessor,你应该可以使用attr_accessor:

<%= form.input :status %>

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

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

  def raise_status
    raise @status
  end
end

这将为状态的值提交值抛出错误。

希望这有帮助。