2011-11-21 18 views
6

Ho un modulo nella mia app Rails 3 in cui voglio creare un tag select per l'anno solo su un metodo :grad_year. Ho tutto il lavoro - e la memorizzazione - correttamente usando date_select e aggiungendo :discard_month e :discard_day. Tuttavia, quando eseguo il rendering di @profile.grad_year, ottengo i valori del mese e del giorno. Quindi mi chiedo come archiviare e rendere solo l'anno per @profile.grad_year?Rails 3 date_select solo per anno

Qui è 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 %> 

Nella mia migrazione:

t.date :grad_year 

risposta

11

Rails ha un select_year aiutante:

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

Quindi il codice dovrebbe essere simile:

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

Grazie, ho provato qualcosa di simile, ma ha ottenuto un errore: 'metodo non definito select_year per # < ActionView :: Helpers :: FormBuilder: 0x1085b2198> ' – tvalent2

+0

Provare ad escludere il' f' all'inizio. –

+0

Funziona, ma non verrà inviato al database giusto? – tvalent2

5

Assemblaggio di tutto quanto sopra da @ di alex_peattie risposta, sono arrivato al seguente:

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

Come con la domanda del PO, il mio caso è stato fatto all'interno di un blocco form_for, così f.select_year ha generato un'eccezione. Ma se usi semplicemente l'opzione documentata :field_name, il tag avrà l'id date_grad_year e il nome date[grad_year] che non sono quelli che Rails si aspetta. Utilizzando l'opzione (documentata solo nella parte superiore dell'API) :prefix cambia date a profile.

Quindi questo è meglio del # @% $^* & html_options hash, che, nonostante l'uso di binari da 5 anni, non riesco a ottenere il risultato corretto senza cinque tentativi :-).

Oh Rails, come ti amo, ma allo stesso tempo sono sicuro che lo Stack Overflow è disponibile per aiutarci a comprendere le tue deliziose idiosincrasie!

+0

Esattamente quello che stavo cercando. Grazie. –

+2

Una soluzione più generale sarebbe 'select_year f.object.field_name ...: prefix => f.object_name' –

2

Questa funzione select_year è totalmente fasulla.

Ecco infine cosa funziona:

<%= 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" %> 
<% ... %> 

è alcunché di essere come questo in rotaie:

<%= 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

Seriamente ... che diamine RoR ... * sigh * – Volte