2009-09-14 81 views
22

有沒有簡單的方法來在Rails視圖中格式化DateTime值的顯示?在Rails文本框中格式化日期時間

例如,如果我在做這樣的事情:

<%= text_field :my_object, :start_date %> 

,只希望顯示:start_date的日期部分(即我想要隱藏的部分時間),是有辦法格式視圖中的:start_date字符串,以便它可以用於創建新的my_object項目並更新新的my_object項目?

只是澄清:

<%= text_field 
     :my_object, 
     :start_date, 
     :value => @my_object.start_date.strftime('%m/%d/%Y') %> 

工作精美當對象已經存在(即在項目的更新),但是,創建一個項目時,由於起始日期最初將無,視圖會拋出錯誤

while evaluating nil.strftime 

回答

35

這裏有一些很棒的建議,但是在那些你真的希望你的文本字段日期格式化爲某種特定方式的情況下(比如你正在與一個JavaScript日期選擇器集成),並且你正在處理nils,做出細微調整,以現有的方法會做的伎倆:

:value => (@object.start_date.blank? ? '' : @object.start_date.strftime('%m/%d/%Y')) 
+0

你錯過了最後一個結束的paren,但是否則這就是我一開始就做的。我最終選擇了將'start_date'初始化爲對象當前日期的路由,以便'start_date'永遠不會成爲'nil'。 – jerhinesmith 2011-01-14 16:53:20

+0

更清潔:值:(@ object.start_date.strftime('%m /%d /%Y')除非@ object.start_date.blank?) – 2014-06-21 12:01:57

+0

@OleHenrikSkogstrømnil與空字符串不同(datepickers我用過)。絕對使用,除非這樣,但如果它適合你。 – 2014-10-15 02:37:54

4

如果你R型被綁定到一個對象,(像<% form_for(:object) do |f| %>),你應該使用<%= f.text_field :start_date, :value => f.object.start_date.to_s(:date_format) %>

那麼您可以在配置您的:date_format註冊/ environment.rb中

不知道爲什麼你想這樣做,但我希望這是僅供介紹之用。

+1

這主要是爲了防止有人認爲他們需要或應該輸入時間。對於大多數用戶「2019-09-10 17:00:18」只是不友善。我寧願只展示「09/10/2009」,因爲時間部分對我所做的事情來說完全沒有必要。 – jerhinesmith 2009-09-14 15:43:25

+0

那麼你應該使用select_date helper而不是普通輸入 – Eimantas 2009-09-14 15:46:35

+0

同意,如果是用於選擇日期,日曆或select_date助手是更好的方法 – Yaraher 2009-09-14 15:50:30

7

我能想到的方式有三種:

1)創建的模型的新方法,將格式化你的日期,但是你需要它是

2)創建的helper方法,會做同樣的

3)您是否嘗試過這樣做的:

<%= text_field 
    :my_object, 
    :start_date, 
    :value => @my_object.try(:start_date).try(:strftime,'%m/%d/%Y') %> 
+0

數字3爲我工作得很漂亮。謝謝。 – brad 2010-04-17 12:59:40

2

在我application_helper.rb我把

def nice_date_form(the_date) 
    return the_date.strftime('%d-%m-%Y') 
end 

在任何edit.html。與一個jQuery日期選擇器ERB視圖文件I然後使用:

<% if @activity.end_date? %> 
    <%= f.text_field :end_date, :value => nice_date_form(@activity.end_date) %> 
<% else %> 
    <%= f.text_field :end_date %> 
<% end %> 
+0

如果'the_date'爲零,這不會引發錯誤嗎? – jerhinesmith 2011-02-23 18:46:14

+0

@jerhinesmith你是絕對正確的。沒有正確測試。 我改變了上面的代碼來測試nil。你也可以用Dave Rapin的方式做到這一點,在一個很好的單線。 – 2011-03-16 17:30:41

+0

如果將'nice_date_form'改爲'return(the_date?the_date.strftime('%d-%m-%Y'):'')',那該怎麼辦?然後,您應該能夠從視圖中刪除條件。 – jerhinesmith 2011-03-16 18:14:16

0

在輔助

def l(value, options = {}) 
    return nil unless value.present? 
    value = value.to_date if value.is_a? String 
    super(value, options) 
end 

然後在視圖

<%= f.text_field :end_date, class: "datepicker" :value => l(@activity.end_date) %> 

這裏l是一個導軌輔助(I18n.l),其可是區域設置特定並且可以採取格式。實例:

l(@activity.end_date, format: :short) 
l(@activity.end_date, format: "%d-%m-%Y") 
1

這可以在使用所述模型層進行處理乾巴巴的Rails提供的<attribute>_before_type_cast方法變型。 Rails已經使用這種方法來完成這種類型的格式化,所以我們只是覆蓋默認值。例如:

class MyModel 
    def start_date_before_type_cast 
     return unless self[:start_date] 
     self[:start_date].strftime('%m/%d/%Y') 
    end 
end 

這樣一來,任何地方,你有你所得到的格式爲「免費」的爲MyModel#起始日期字段的文本字段。