2011-11-21 15 views
6

Mam formularz w mojej aplikacji Rails 3, w którym chcę utworzyć tag select tylko na rok na metodzie :grad_year. Mam wszystko działa - i przechowywanie - poprawnie używając date_select i dodając :discard_month i :discard_day. Jednak po renderowaniu @profile.grad_year otrzymuję wartości miesiąca i dnia. Zastanawiam się, jak przechowywać i renderować tylko rok dla @profile.grad_year?Rails 3 date_select tylko dla roku

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

W moim migracji:

t.date :grad_year 

Odpowiedz

11

Rails ma select_year pomocnika:

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

więc kod powinien wyglądać następująco:

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

Dzięki, próbowałem coś podobnego, ale mam błąd: 'metody niezdefiniowanej select_year dla # < ActionView :: Helpers :: FormBuilder: 0x1085b2198> ' – tvalent2

+0

Spróbuj wykluczyć' f. 'Na początku. –

+0

To działa, ale czy nie zostanie przesłane do bazy danych, prawda? – tvalent2

5

Montaż wszystkich wyżej od użytkownika @ alex_peattie odpowiedź, przybyłem na następujące:

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

Jak w pytaniu PO, w moim przypadku było zrobione w form_for bloku, więc f.select_year zwrócił wyjątek. Ale jeśli użyjesz tylko udokumentowanej opcji :field_name, znacznik będzie miał identyfikator date_grad_year i nazwę date[grad_year], które nie są tym, czego oczekuje Rails. Użycie opcji (udokumentowane tylko u góry interfejsu API) :prefix zmienia date na profile.

To jest lepsze niż # @% $^* & hashtage html_options, które pomimo używania torów przez 5 lat nie wydaje mi się poprawne bez pięciu prób :-).

Oh Rails, jak bardzo Cię kocham, ale jednocześnie jestem pewien, że cieszę się, że Stack Overflow pomaga nam wszystkim zrozumieć twoje rozkoszne dziwactwa!

+0

Dokładnie to, czego szukałem. Dzięki. –

+2

Bardziej ogólnym rozwiązaniem tego problemu byłoby 'select_year f.object.field_name ...: prefix => f.object_name' –

2

Ta funkcja select_year jest całkowicie pomijana.

Oto wreszcie, co działa:

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

to coś tak być w szynach:

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

Poważnie ... co do cholery RoR ... * westchnienie * – Volte