2011-04-05 85 views
1

目前我們正在處理用戶輸入的時間。Ruby on Rails以時間的字符串輸入並將其存儲爲整數

我們想把輸入作爲一個字符串輸入,對於用戶來說最自然的是 ex。 12:30,1:30。

請注意,時間不是基於特定的日期,而只是一天的時間。

但是在我們的模型中,我們希望將實際時間存儲爲整數(午夜後的秒數)。我們需要它作爲一個整數來執行某些約束檢查,而不是。這也將是我們容易然後再次輸出一個不錯的字符串

Time.at().utc.strftime("%I:%M%p") 

我們正在運行到的問題是,我們要驗證通過使用正則表達式的用戶的字符串輸入午夜之後將其轉換爲秒前並存儲它。 但是,似乎在我們的模型validates_by_format之前,該字段已經被轉換爲某種整數類型。任何關於如何使用正則表達式來檢查用戶輸入的想法,然後再將其轉換並存儲爲整數(午夜後的秒數)?

下面是一些我們的代碼snipits的:

模型驗證

validates_format_of :start_time, :with => /\A(1[0-2]|[1-9]):[0-5][0-9]\z/, :message => "Must be valid time format" 

在我們的餐桌

start_time :integer 
end_time :integer 

控制器功能

def create 
    @course_offering = current_term.course_offerings.new(params[:course_offering]) 

    if @course_offering.save 
     #flash[:success] = "Offering created" 
     @conflicts = conflicts(@course_offering) 
     render :show 
    else 
     render :new 
    end 
    end 

新的領域六EW

<% form_for @course_offering do |f| %> 
<!-- other fields above this --> 
<p> 
    <%= f.label :start_time %><br> 
    <%= f.text_field :start_time %> 
</p> 
<p> 
    <%= f.label :end_time %><br> 
    <%= f.text_field :end_time %> 
</p> 
<% end %> 
+1

請發佈您的new.html.erb或同等學歷。 – 2011-04-05 19:46:26

回答

1

我們最終解決了我們的困境。我們將start_time和end_time保持爲整數,但我們在模型中使用了虛擬屬性來獲取模型中的字符串輸入。

# our new fields 
<p> 
    <%= f.label :start_time_string %><br> 
    <%= f.text_field :start_time_string %> 
</p> 

# model 
def start_time_string 
    Time.at(start_time + 5*3600).strftime("%l:%M %p") if !start_time.nil? 
end 

def start_time_string=(start_time_str) 
    self.start_time = Time.parse(start_time_str).seconds_since_midnight 
end 

這樣我們的用戶可以輸入像'12:30 PM'這樣的時間,但它保存爲午夜後的美好時光。

1

我會使用,檢查是否有可能來分析用戶輸入了有效時間自定義的驗證方法,像這樣的模式:

validate :user_must_enter_valid_time 

def user_must_enter_valid_time 
    errors.add(:start_time, "Incorrect format of start time") if 
     !valid_time?(start_time) 
end 

def valid_time?(time_string) 
    begin 
    parsed_input = Time.parse(time_string) 
    #Checking if user entered time no earlier than 24 hours before current time 
    return Time.now - parsed_input < 24 * 60 * 60 
    rescue Exception => e 
    return false 
    end 
end 
+0

我不是很積極,這是做什麼,但我不明白這將如何繞過我們不能使用我們上面寫的驗證的問題。問題是我們在視圖中將輸入視爲一個字符串,想要驗證字符串是否爲我們的正則表達式的有效輸入,然後將其轉換爲整數(午夜後的秒數),並將其作爲整數值存儲在start_time中。 – febs 2011-04-05 20:37:45

+0

@febs - 第一種方法是一種新的驗證方法,告訴應用程序在方法valid_time?(start_time)返回false時添加錯誤。第二種方法定義valid_time?(time_string)。它在兩種情況下返回false:a)string time_string不能轉換爲Time並返回異常,例如用戶輸入「abcd」; b)time_string被解析爲比Time.now早24小時的時間,因爲據我所知,您還需要驗證這一點。我編輯了代碼,使其更好。正則表達式很好,但它很難理解,並且它不驗證用戶是否輸入了比需要更早的時間。 – 2011-04-06 04:48:09

+0

我喜歡這種方法,但我們的問題是從start_time字段到驗證模型的值的實際傳遞。此外,我們並不試圖檢查時間是在午夜之前,這只是我們要存儲時間的方式。我們正在使用一天中的任意時間(沒有日期),所以這似乎是一個好主意。我給自定義驗證一個鏡頭,但是當用戶輸入(12:30或1:53)時,數值在小時編號處被切斷,我認爲這與數據庫中的整數數據類型有關,而我們的用戶字符串輸入。 – febs 2011-04-06 13:18:40

相關問題