2010-11-17 43 views
1

我有一個預約模式,採取預約屬性作爲date並具有虛擬屬性duration指示任命需要多長時間。真正的屬性,booking_end採取即都在我的應用程序引用的時間。但是,爲了便於輸入,我們使用的持續時間,而不是選擇其他Time的。這些字段是如下:如何在保存前引用屬性?

def duration 
    ((booking_end - date)/1.hour).round(2) rescue nil 
end 

def duration=(temp) 
    if (true if Float(temp) rescue false) 
    self.booking_end = time_round(date + temp.to_f.hours, 15.minutes) 
    else 
    errors.add(:duration, "must be a number, stated in hours.") 
    self.booking_end = nil 
    end 
end 

當我引用date場,同時創造了新的記錄整個事情失敗。由於日期尚未初始化,我得到'無'錯誤。我該如何解決這個問題?當更新現有記錄時,其餘部分工作。

+0

什麼樣的價值應該在'date'屬性默認爲? – 2010-11-17 02:21:20

+0

它在視圖中默認爲將來的日期和時間。目前,驗證檢查它是有效日期而不是無。 – Nuby 2010-11-17 02:32:18

回答

0

當調用Reservation.new(:日期=>日期,:持續時間=>持續時間)的ActiveRecord ::基地分配屬性值這樣(參見assign_attributes法):

attributes.each do |k, v| 
    ... 
    respond_to?("#{k}=") ? send("#{k}="", v) 
    ... 

哈希#通過值中的每個方法迭代該方式:持續時間密鑰之前訪問:日期之一,所以日期爲零的持續時間=方法內:

ruby-1.8.7-p302 > {:date => Date.today, :duration => 5}.each do |key,value| 
ruby-1.8.7-p302 >  puts "#{key} = #{value}" 
ruby-1.8.7-p302 ?> end 
duration = 5 
date = 2010-11-17 

所以你必須調用持續時間=初始化之後。

或者你可以重新預約#初始化調用超:日期,然後用參數的其餘update_attributes方法。

+0

我試圖初始化Reservation.new模型(PARAMS [:預約] [:日期]) – Nuby 2010-11-17 14:36:32

+0

參見加入約初始化 – msorc 2010-11-17 22:52:44

0

我試着用

Reservation.new(params[:reservation][:date]) 

初始化模型,然後調用它update_attributes。這在控制檯中工作,但不是。似乎採取的唯一解決方法是剝離持續時間超出params散列,然後在保存之前將其傳回。然而,這看起來很愚蠢,可能不是正確的或Rails的做法。使用4條線就足夠了。

duration = params[:reservation][:duration] 
params[:reservation].delete('duration') 
@reservation = Reservation.new(params[:reservation]) 
@reservation.duration = duration 
# Then go to save, etc. 

是否有不同的方式來初始化模型或從模型中訪問屬性散列?