0

これを作成する手順:

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に移動して時間を保存してから再編集すると、日付/時刻の 2 つの異なる表現が表示されます。1 つは誤って保存され、もう 1 つは保存されます。

編集:機能するものを使用しない理由を尋ねるかもしれません。これの問題は、ネストされた属性を使用しているため、これを正確に行うことができないことです。私はこれをやってみました:

# 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>
4

1 に答える 1

0

「慣例」をオーバーライドして、次のようなものを用意する必要があることがわかりました。

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

を使用:valueすると、タイムゾーンの違いも得られ、問題が解決しました!

于 2010-05-29T19:54:09.017 に答える