在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提供的
方法变体在模型层进行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")