2013-02-12 80 views
0

我有一個模型W /虛擬屬性:在Ruby on Rails中訪問虛擬屬性的正確方法是什麼?

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

現在,在我看來,當我campaign.status訪問屬性,我得到了正確的結果。但是,當我嘗試訪問它像這樣campaign[:status],我沒有得到任何回報。

這是爲什麼?

回答

2

[:status]在Ruby中使用[]方法。 'def status'定義了一個不應該被ActiveRecord屬性或虛擬屬性誤解的方法(例如attr_reader或attr_accessor)。 ActiveRecord將[]方法添加到您的類中,並通過object [:attr_name]和object.attr_name(甚至object.attributes [:attr_name])訪問所有(數據庫)屬性。

這與f.e.不同。 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 

這將拋出一個錯誤與狀態提交的值值。

希望這會有所幫助。

+0

我將如何獲得虛擬屬性工作呢?我試圖添加行: attr_accessor:狀態 這似乎沒有幫助 – user210881 2013-02-12 23:37:15

+0

編輯我的回覆。 – Novae 2013-02-12 23:52:29

相關問題