2011-11-21 23 views
6

Tengo un formulario en mi aplicación Rails 3 donde quiero crear una etiqueta select solo para el año en un método :grad_year. Tengo todo funcionando y almacenando correctamente usando date_select y agregando :discard_month y :discard_day. Sin embargo, cuando renderizo @profile.grad_year obtengo los valores de mes y día. Entonces me pregunto cómo almacenar y representar solo el año para @profile.grad_year?Rails 3 date_select for year only

Aquí es la forma:

<%= f.date_select :grad_year, {:start_year => Time.now.year, :end_year => Time.now.year - 95, :discard_day => true, :discard_month => true}, :selected => @profile.grad_year %> 

En mi migración:

t.date :grad_year 

Respuesta

11

rieles tiene un select_year ayudante:

http://apidock.com/rails/ActionView/Helpers/DateHelper/select_year

lo tanto, su código debería ser similar:

f.select_year(Date.today, :start_year => Time.now.year, :end_year => Time.now.year - 95, :field_name => 'grad_year') 
+1

Gracias, he intentado algo similar pero consiguieron un error: 'select_year método no definido para # < ActionView :: Helpers :: FormBuilder: 0x1085b2198> ' – tvalent2

+0

Intente excluir' f.' al principio. –

+0

Eso funciona, pero luego no se enviará a la base de datos ¿verdad? – tvalent2

5

Montaje de todo lo anterior, de la respuesta de @ alex_peattie, llegué a la siguiente:

<%= select_year Date.today, :start_year => Time.now.year, :end_year => Time.now.year - 95, :field_name => :grad_year, :prefix => :profile %> 

Al igual que con la pregunta de la OP, mi caso fue hecho dentro de un bloque form_for, por lo f.select_year inició una excepción. Pero si solo usa la opción documentada :field_name, la etiqueta tendrá el id date_grad_year y el nombre date[grad_year] que no son lo que Rails espera. Usando la opción (documentada solo en la parte superior de la API) :prefix, cambia date a profile.

Esto es mejor que el # @% $^* & html_options hash, que, a pesar de utilizar rieles desde hace 5 años, parece que no puedo hacerlo bien sin cinco intentos :-).

Oh Rails, cómo te quiero, pero al mismo tiempo estoy seguro de que está contento Stack Overflow para ayudarnos a todos a entender tu idiosincrasia encantadora!

+0

Exactamente lo que estaba buscando. Gracias. –

+2

Una solución más general a esto sería 'select_year f.object.field_name ...: prefix => f.object_name' –

2

Esta función select_year está totalmente atornillada.

Aquí es finalmente lo que funciona:

<%= form_for(@user) do |f| %> 
<%= select_year current_user.birth_year, { :prompt => "Year", 
              :start_year => Time.zone.now.year - 13, 
              :end_year => Time.zone.now.year - 80, 
              :field_name => :birth_year, 
              :prefix => :user }, 
              class:"form-control" %> 
<% ... %> 

que algo sea así en rieles:

<%= f.select_year :birth_year, { :prompt => "Year", 
              :start_year => Time.zone.now.year - 13, 
              :end_year => Time.zone.now.year - 80}, 
              class:"form-control" %> 
+0

En serio ... qué demonios RoR ... * suspiro * – Volte