在Rails中的文本框中格式化日期时间

是否有一种简单的方法来格式化Rails视图中的DateTime值的显示?

例如,如果我做的事情如下:

  

并且只想显示:start_date的Date部分(即我想隐藏时间部分),有没有办法在视图内部格式化:start_date字符串,以便它可以用于创建新的my_object项目和更新新的my_object项目?

只是澄清一下:

  @my_object.start_date.strftime('%m/%d/%Y') %> 

当对象已经存在时(即在项目更新时)工作得非常漂亮 ,但是,在创建项目时,由于start_date最初将为nil,因此视图将引发错误

 while evaluating nil.strftime 

这里提出了一些很好的建议,但是在那些你确实想要将文本字段日期格式化为特定方式的情况下(比如你正在使用javascript日期选择器进行集成),并且你正在处理nils,我想只是做一个小调整你现有的方法可以做到这一点:

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

我可以想到三种方式:

1)在模型上创建一个新方法,可以格式化您的日期,但是您需要它

2)创建一个可以执行相同操作的辅助方法

3)你有没有尝试过:

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

如果你的表单绑定到一个对象(比如<% form_for(:object) do |f| %> ),你应该使用<%= f.text_field :start_date, :value => f.object.start_date.to_s(:date_format) %>

然后你可以在config / environment.rb中注册你的:date_format

不确定为什么要这样做,但我希望它仅用于演示目的。

在我的application_helper.rb中我放了

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

在任何带有jQuery日期选择器的edit.html.erb视图文件中,我然后使用:

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

这可以使用Rails提供的_before_type_cast方法变体在模型层进行DRYly处理。 Rails已经使用这种方法来做这种类型的格式化,所以我们只是覆盖了默认值。 例如:

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

这样,只要您有MyModel #start_date字段的文本字段,就可以获得“免费”格式。

如果您不想在文本字段中输入日期,但是在一个不易出错的选择字段中,您可以使用ActionView :: Helpers :: DateHelper , select_date() 。 请参阅访问日期()变量从此处的rails中的日期助手发送,以了解如何处理返回值。

在帮手

 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是一个rails helper( I18n.l ),它可以是特定语言环境的 ,可以采用一种格式。 例子:

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