如何在 Rails 中为 datetime_field_tag 设置默认值
Posted
技术标签:
【中文标题】如何在 Rails 中为 datetime_field_tag 设置默认值【英文标题】:How to have a default value for datetime_field_tag in Rails 【发布时间】:2017-05-22 13:28:49 【问题描述】:在我看来,我正在尝试为datetime_field_tag
设置一个默认值:
=form_tag form_path, method: :get do
=label_tag :sign_up_at, 'Sign up before:'
=date_field_tag :sign_up_at, (params[:sign_up_at] ||
Time.zone.today.strftime("%Y-%m-%d"))
=label_tag :last_seen_at, 'Last seen after:'
=datetime_field_tag :last_seen_at, (params[:last_seen_at] ||
Time.zone.now.strftime("%d-%m-%YT%H:%M"))
=submit_tag 'Filter', class: 'btn-info'
这导致在 html 中有一个value
标记:
<input type="datetime-local" name="last_seen_at" id="last_seen_at" value="22-05-2017T16:34">
我的猜测是,我在解析 Time
时遇到了某种问题。有人可以帮忙吗?谢谢!
根据@deephak 的回答更新。
【问题讨论】:
【参考方案1】:只是为了补充这里的另一个答案:datetime_field_tag
助手对给它的日期时间格式很敏感。例如,如果日、月和年的顺序错误,则该值将不会显示在表单输入中(并且如果您打开了开发者控制台,则会显示警告消息)。
这可能取决于您的语言环境,但 OP 的 "%d-%m-%YT%H:%M"
格式字符串的年份和日期是相反的。 "%Y-%m-%dT%H:%M"
似乎在我的试验中修复了它。
【讨论】:
【参考方案2】:您正在使用today
,它只会给您date
而不是时间。
因此,当您尝试获取过期时间时,rails 将返回 00:00
示例:
Time.zone.today
#=> Mon, 22 May 2017
Time.zone.now
#=> Mon, 22 May 2017 09:34:57 EDT -04:00
要解决这个问题,请更改
Time.zone.today.strftime("%d-%m-%YT%H:%M")
#=> "22-05-2017T00:00"
到
Time.zone.now.strftime("%d-%m-%YT%H:%M")
#=> "22-05-2017T09:33"
# OR
Time.current.strftime("%d-%m-%YT%H:%M")
#=> "22-05-2017T09:33"
【讨论】:
谢谢!这样就解决了时间不正确但还是看不到默认值的问题。 您可以尝试删除params[:last_seen_at]
一次
尝试按照您的建议删除参数,但仍然无法在浏览器中看到默认值,只能作为value
标记。
它应该可以工作apidock.com/rails/v4.0.2/ActionView/Helpers/FormTagHelper/…
检查你是否遗漏了什么【参考方案3】:
上面的答案是正确的,但是如果你想重构这个,你可以设置一个时间格式初始化器。
config/time_formats.rb
Time::DATE_FORMATS[:datetime_field] = '%Y-%m-%dT%H:%M'
那么在设置值的时候可以使用:
Time.zone.today.to_s(:datetime_field)
请记住在更改初始化程序后重新启动您的rails s
。
【讨论】:
以上是关于如何在 Rails 中为 datetime_field_tag 设置默认值的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Rails 3.1 中为 CoffeeScript 使用选项“--bare”?
如何在 Rails 4 中为 AngularJS 更正设置根路由?