2011-06-13 6 views
5

Especifiqué config.time_zone en mi aplicación Rails, pero los tiempos recuperados en los campos de formulario todavía aparecen como UTC (lo que crea problemas en las actualizaciones). ¿No debería convertirse esto a la hora local en la zona especificada?aplicación Rails config.time_zone no se aplica cuando se rellenan campos de formulario para vista '/ edit'

/config/application.rb (sólo las líneas relevantes):

module ExampleSite 
    class Application < Rails::Application 

     config.time_zone = 'Central Time (US & Canada)' 
    end 
end 

/events/edit.html.erb (archivo completo):

<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 (líneas relevantes solamente :)

<div class="field"> 
    <%= f.label  :time_start, "Start Time" %><br /> 
    <%= f.text_field :time_start, :class => "datetimefield" %> 
</div> 
<div class="field"> 
    <%= f.label  :time_end, "End Time (if applicable)" %><br /> 
    <%= f.text_field :time_end, :class => "datetimefield" %> 
</div> 

Cuando entro en la cadena de fecha y hora para crear un nuevo evento, el valor se guarda correctamente (en UTC) y me hacía n mis vistas según lo deseado (en la zona horaria local) donde tenía mostrando UTC antes de el conmutador config.time_zone (así que sé que se realizó el cambio).

Pero cuando voy a editar cualquier otro atributo del evento, el tiempo representado en el campo de formulario en la vista/edit es la hora UTC, lo que significa que cuando actualice el evento, el tiempo se volverá a guardar como aunque el tiempo se volvió a introducir y se presume local, lo que modifica el tiempo en 5 horas (mi diferencia local respecto de UTC) a medida que el sistema convierte el atributo de tiempo "actualizado" en UTC para el almacenamiento.

¿Cómo puedo hacer que la hora localizada se represente en mis campos de formulario?

carriles de rodadura 3.0.5, el despliegue de Heroku (aunque existe el problema, tanto en entornos de desarrollo y producción)

+1

¿Puedes publicar el código de tu vista que genera el formulario? – Teddy

+0

generalmente agrego un método formated_date en mis modelos que usan tiempo. algo como esto: def format_date (date) date.getlocal.strftime ("% m /% d /% y") end, getlocal convierte el tiempo utc en el servidor local – corroded

+1

Después de analizarlo más detenidamente, he determinado que todo funciona correctamente * excepto * para los campos del formulario. La fecha y hora UTC de la base de datos se debe convertir a la zona adecuada, ya que está poblada en los campos time_start y time_end, pero en su lugar solo está rellenando esos campos con el UTC. ¿Esto no está cubierto por la configuración config.time_zone? Y si no, ¿cómo puedo poblar los campos con tiempos de zonificación adecuados? – jasonmklug

Respuesta

8

Resulta que el problema real estaba en los text_fields mismos.

Mi configuración 'config.time_zone' estaba funcionando bien (sin ningún método adicional o hacks) en mis vistas 'index' y 'show', y funcionó también en la vista 'edit', siempre que utilizó un datetime_select en lugar de un text_field.

Como esto no era una opción para mí (yo estaba usando DatePicker de jQuery UI, que necesita un text_field), que investigó el problema específico text_field y answered another StackOverflow question of my own on the subject.

Si tiene el problema text_field, revise esa pregunta/respuesta.

0

se puede hacer algo como esto:

heroku config:add TZ=America/Chicago 

Eso debería arreglar su problema en Heroku.

+0

Intenté esto, pero no pareció afectar nada (los mismos tiempos incorrectos con el mismo desplazamiento se cargaron en mis formularios). ¿Hay otra opción de configuración para mi aplicación que debería ver también? Intenté esto con config.time_zone y sin él. – jasonmklug

1

Sólo tiene que utilizar esto:

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

puedo crear una pequeña aplicación para esto y es obras.

Cuestiones relacionadas