2014-05-11 88 views
2

我想用調查功能構建應用程序。要接收來自用戶的答案,我添加了非持久性屬性is_checked(我的持久性屬性is_right在我的模式中)。Ruby on Rails,訪問非永久屬性和屬性默認值

class Answer < ActiveRecord::Base 
    belongs_to :question 
    attr_accessor :is_checked 

    def initialize 
    self.is_checked = false 
    end 

    after_initialize :default_values 

    private 

    def default_values 
    self.is_right ||= false 
    end 
end 

但是當我打開軌道控制檯,然後運行:

Survey.first.questions.last.answers.last.attributes 

沒有is_checked屬性。如果我打電話給is_checked getter回答實例我得到

+0

我想,然後才能訪問到這個屬性'initialize'方法開始。這意味着你的'is_checked'屬性不能是'false',因爲它還不存在。你可以把你的行'self.is_checked = false'放在你這樣開始的方法中:'after_create:my_method'。 – BriceB

回答

3

Imho你的initialize方法永遠不會被調用,否則,因爲你不打電話super你將失去​​所有的活動記錄初始化。

您的initialize與原始簽名(它至少接受一個哈希值)絕對不匹配,但是after_initialize正是由於這個原因而引入的。

所以我只是擴大default_values包括設置您的is_checked

另外attr_accessor創建一個實例變量的訪問方法,所以只需設置該實例變量。

所以我會寫

class Answer < ActiveRecord::Base 
    belongs_to :question 
    attr_accessor :is_checked 

    after_initialize :default_values 

    private 

    def default_values 
    self.is_right ||= false 
    @is_checked = false 
    end 
end