【问题标题】:Why does Rails screw up timezones when I am editing a resource?为什么我在编辑资源时 Rails 会搞砸时区?
【发布时间】:2011-02-25 13:13:45
【问题描述】:

制作步骤:

prompt>rails test_app
prompt>cd test_app
prompt>script/generate scaffold date_test my_date:datetime
prompt>rake db:migrate

现在编辑您的app/views/date_tests/edit.html.erb

<h1>Editing date_test</h1>

<% form_for(@date_test) do |f| %>
  <%= f.error_messages %>
  <p>
    RIGHT!<br/>
    <%= text_field_tag @date_test, f.object.my_date %>
  </p>
  <p>
    WRONG!<br />
    <%= f.text_field :my_date %>
  </p>
  <p>
    <%= f.submit 'Update' %>
  </p>
<% end %>

<%= link_to 'Show', @date_test %> |
<%= link_to 'Back', date_tests_path %>

现在编辑您的config/environment.rb

#add this
config.time_zone = 'Central Time (US & Canada)'

这重现了我在实际应用中遇到的问题。我的应用程序的问题是我将日期存储在隐藏字段中并呈现“用户友好”版本。创建资源工作正常,但一旦我尝试编辑它,时间就会改变(它增加了我当前时区配置和 UTC 之间的差异)。转到http://localhost:3000/date_tests/new 并保存时间然后重新编辑它,您将有两种不同的日期/时间表示,一种会错误保存,另一种会保存。

编辑:有人可能会问,为什么不直接使用有效的。问题在于我使用的是嵌套属性,所以我不能完全做到这一点。我试过这样做:

# from my real app:
<% appt.fields_for :time_slot do |ts| %>
  <%=h ts.object.start_at.strftime('%T') %>
  <%= hidden_field ts.object.start_at, :start_at %>
  <%= hidden_field ts.object.end_at, :end_at %>
<% end %>

但 html 结果为:

<div>

      10:00:00
      <input id="2010-05-30_10:00:00_-0500_start_at" name="2010-05-30 10:00:00 -0500[start_at]" type="hidden">
      <input id="2010-05-30_10:10:00_-0500_end_at" name="2010-05-30 10:10:00 -0500[end_at]" type="hidden">
      <input id="appointment_block_appointments_attributes_0_time_slot_attributes_id" name="appointment_block[appointments_attributes][0][time_slot_attributes][id]" type="hidden" value="95">
</div>

【问题讨论】:

    标签: ruby-on-rails timezone datetime-format


    【解决方案1】:

    好吧,事实证明我需要重写“约定”并有类似的东西:

    <%= ts.hidden_field :start_at, :value => ts.object.start_at %>
    

    使用:value 也会给我提供时区差异,从而解决我的问题!

    【讨论】:

    • 是您使用fields_for时的约定。你之前用hidden_field_tag的签名,但是调用hidden_field,不一样。
    • 不,我明白。查看第一个代码块。约定正在使用,但它没有做我想要的(见错误!)。使用 :value 解决了我不使用 hidden_​​field 的问题...因为我已经在使用它了。它只是没有正确格式化我的日期/时间。
    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    相关资源
    最近更新 更多