2012-12-05 57 views
0

我有一個簡單的Rails 3模型,在數據庫中沒有字段的attr_accessor,我需要使用燈具設置它,因爲我的初始化設置。在Rails中使用燈具分配attr_accessor

但是,當我嘗試它,我得到關於未知列的錯誤。

是否有另一種方法可以做到這一點?

我的模型:

class Timeslot < ActiveRecord::Base 
    attr_accessor :interval 
    after_initialize :init 

    def init 
     self.interval ||= 15 
     self.start_time ||= Time.local(0, 1, 1) 
     self.end_time = self.start_time.advance :minutes => self.interval 
    end 
end 
+0

1.你爲什麼要使用|| =你的初始化? 2.我想知道你是否有意編寫'def initialize' ... – Elland

+0

@Elland我正在使用after_initialize宏,因爲我想設置默認值,因此|| =。我嘗試過使用'def initialize'之前,並有一個問題,不記得是什麼... –

回答

1

燈具添加數據直接寫入數據庫。如果您想將數據傳遞給模型,請考慮使用工廠(Factory Girl是一個好的庫)。

您可能已經對夾具進行了大量投資,但工廠非常值得一看。

+0

謝謝,我結束了切換工廠的燈具 –

1

燈具是最終狀態。意思是,在你調用attr_accessor之後,你的數據庫中會有什麼輸出。因此,如果您在像@timeslot = timeslots(:your_name_of_fixture)這樣的測試中使用end_time,則總是會爲您計算。除了設置時,您不必在夾具中擔心它們。

現在,我還沒有看到after_initialize之前,但我看到它是一個回調函數。對我來說,你正在一個視圖中設置一個間隔。可能不是以編程方式(除非那是默認的15分鐘)。

切換到before_save回調(如果你想你的人能夠改變編輯間隔太),如:


class Timeslot < ActiveRecord::Base 
    attr_accessor :interval 
    before_save :set_times 
    def set_times 
     self.interval ||= 15 
     self.start_time ||= Time.local(0, 1, 1) 
     self.end_time = self.start_time.advance minutes: self.interval 
    end 
end