Rails 'config.time_zone' не применяется к данным даты и времени, загруженным в текстовое поле. Фикс? - PullRequest
8 голосов
/ 02 июля 2011

Когда я использую datetime_select в своей форме, Rails корректно отрегулирует часовой пояс данных datetime (согласно моей настройке config.time_zone) и отобразит правильно зонированное время в представлении edit той же формы..

Но когда я пытаюсь извлечь те же данные в текстовое поле (для того же вида edit той же формы), Rails, похоже, не подстраивается под часовой пояс.

/events/edit.html.erb (полный файл):

<h1>Edit This Event</h1>
<%= form_for(@event) do |f| %>
    <%= render 'fields', :f => f %>
    <div class="actions">
        <%= f.submit "Update Event" %>
    </div>
<% end %>

/ events / _fields.html.erb (только соответствующие строки:)

<div class="field">
    <%= f.label      :time_start, "Start Time" %><br />
    <%= f.text_field  :time_start, :class => "datetimefield" %>
</div>

Пример: Смещение моей зоны -500.Я ввожу 8:00 в качестве start_time в форме, 13:00 UTC записывается в базу данных, 8:00 отображается на странице show (благодаря config.time_zone с учетом смещения), но когда я пытаюсьредактируя этот объект, текстовое поле формы для start_time загружается с 13:00 (которое, если передано без изменений, становится 18:00, когда оно сохраняется в базе данных).

Это проблематично, потому что я пытаюсьиспользовать DatePicker пользовательского интерфейса jQuery (с надстройкой TimePicker), который опирается на текстовое поле (не будет работать с datetime_select).

Есть ли способ заставить Rails применять смещение config.time_zoneв текстовые поля?

Запуск Rails 3.0.5, развертывание на Heroku.

Заранее извиняюсь за очень похожий вопрос несколько недель назад.Информация там все еще применима, я просто лучше понимаю проблему, поэтому я переспросил.

Ответы [ 2 ]

16 голосов
/ 04 июля 2011

Как я уже говорил в вопросе, основная проблема, с которой я столкнулся, заключалась в том, чтобы заставить ActiveRecord применить существующий параметр config.time_zone к text_fields.

Оказывается, существует очень простой и перспективный способ сделать это: просто явно добавьте: value и извлеките те же самые данные - никаких дополнительных / новых методов для вызова! В моем случае это означало:

<%= f.text_field  :time_start, :value => f.object.time_start, :class => "datetimefield" %>

Это был промежуточный шаг к другому потенциальному решению, которое я собирался попробовать, и я был удивлен, обнаружив, что оно работает само по себе (опять же, работая с config.time_zone, который я уже установил в config). /application.rb').

Я протестировал его, и он также применяет правильное смещение DST, когда это применимо (как и следовало ожидать, поскольку установлено значение config.time_zone).

1 голос
/ 02 июля 2011

Как насчет преобразования его с TimeZone#utc_to_local?

Ознакомьтесь с документацией по API, http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...