2009-09-14 83 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#起始日期字段的文本字段。