2011-10-21 11 views
8

Tengo un campo birth_date que se almacena como un valor de fecha y hora. Los rieles predeterminados forman helpers escupiendo un formato no muy amigable, p. "2008-06-10 22: 33: 19.000000". El siguiente es el camino de vaililla.Rieles: formato de fecha compatible con el medio ambiente para text_field

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.text_field :birth_date, :size=>"20" %> 
</div> 

¿Cómo puedo simplemente aplicar un formato? Probé varios enfoques, por ejemplo, strftime debería funcionar, pensé. Pero cuando intento lo siguiente, me sale un error undefined method 'strftime' for nil:NilClass

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.text_field :birth_date, :value=>f.object.birth_date.strftime('%m/%d/%Y'), :size=>"20" %> 
</div> 

Sobre la base de algunas otras preguntas/respuestas, he intentado lo siguiente. Funciona para valores no nulos, pero es un código feo, y no funciona para valores en blanco (en realidad muestra la fecha de hoy).

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.text_field :birth_date, :value=> Time.parse(f.object.birth_date.to_s).strftime('%m/%d/%Y'), :size=>"20" %> 
</div> 

En jugando, parece que f.object.birth_date salida es tratada como una fecha, en lugar de fecha y hora. Sin embargo, cuando se muestra en text_field (original, formato feo), incluye la hora. Es viernes por la tarde y mi falta combinada de familiaridad con las formas de los rieles y los objetos de fecha/hora de rubíes me hace sentir como un tonto.

¿Hay alguna forma sencilla de que mi formulario muestre nada si no está en blanco/nulo y una fecha amistosa de lo contrario?

Respuesta

10

Si quieres una cadena en blanco si birth_date está vacía, sólo debe comprobar que no es birth_datenil antemano:

<%= f.text_field :birth_date, :value => (f.object.birth_date.strftime('%m/%d/%Y') if f.object.birth_date), :size => "20" %> 

esta manera, cuando birth_date es nil, :value consigue el sistema de nil.

+0

Gracias, hace lo que necesito. Estaba confundido por qué esto no arroja un error al hacerlo sin la verificación nula. Creo que lo tengo ordenado ahora. Esto hace lo que quiero (aunque todavía parece mucho código). –

+0

De nada. La razón por la que arroja un error sin la verificación 'nil' es porque cuando' f.object.birth_date' es 'nil', intentará llamar' strftime' en él. Debido a que 'nil' no tiene un método' strftime', arroja el error. – Claw

3

¿Ha intentado utilizar el método auxiliar de creación de formas date_select? También puede usar datetime_select, pero parece que solo quiere trabajar con la fecha aquí.

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.date_select :birth_date %> 
</div> 

Los documentos de la API son aquí: http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-date_select Agregar en las opciones que necesita.

Siempre he usado ese enfoque, o un selector de fecha de Javascript como this uno de jQuery UI. Hay complementos para la mayoría de los marcos JS en estos días.

Si DEBE ser un campo de texto, use una biblioteca de análisis de fecha de lenguaje humano como chronic. Funcionará, pero requerirá que analice la entrada del formulario en alguna parte antes de aplicar el atributo a su objeto.

+0

Eventualmente iré a un selector de fecha. Gracias por compartir la fecha_selección, no había usado eso antes. Sin embargo, no me gusta eso como una interfaz. Escribir una fecha de texto humano parece mejor. Personalmente, prefiero un híbrido de un selector habilitado para JavaScript que también te permita escribir una fecha (como la opción jquery que indicaste). –

Cuestiones relacionadas