2009-06-01 15 views
7

Pracuję nad projektem, który ma powtarzające się cotygodniowe wydarzenia. Dlatego używam kilku pól DateTime w nietradycyjny sposób. Nad czym pracuję to FormBuilder, który tworzy pole, które wyprowadza wybór na dzień powszedni i wybiera na czas. Używam plugin dwanaście-godzinny znalazłem w internecie, tak że działa:Pytanie konstruktora szyny Pytanie

class ActionView::Helpers::FormBuilder 
    def dow_time(dow,time,options={}) 
    rval = select(dow, DateTime::DAYNAMES) 
    rval += time_select(time, {:minute_step => 15, :ignore_date => false, :twelve_hour => true}) 
    end 
end 

Problem mam jest to, że dzień tygodnia wybierz rzeczywistości nie mają domyślną wybrano wartość. Działa to dobrze na moich stronach tworzenia, ale nie na stronach edycji. dow jest symbolem odwołującym się do pola w modelu wywołującym, gdzie ciąg dnia tygodnia to "poniedziałek", "wtorek" itp. Jak mogę wyciągnąć tę wartość z modelu wywołującego za pomocą dow.

self[dow] 

Nie działa, ponieważ jest w innej klasie.

Wszelkie pomysły? Coś innego?

Odpowiedz

13

Jeśli jesteś wewnątrz FormBuilder, można uzyskać dostęp do bieżącego obiektu po prostu za pomocą zmiennej „cel”.

Ex:

w: edit.html.erb

<% form_for(@event) do |form| %> 
    <%= form.custom_datetime_select(:event_starts_at) %> 
<% end %> 

W swojej FormBuilder

def custom_datetime_select(field, options = {}) 
    start_time = object.send(field) 
    ... 
end 

Zarówno object i object_name są dla ciebie, gdy nazywają form_for.

Aby uzyskać więcej informacji, patrz actionpack/lib/action_view/helpers/form_helper.rb.

+0

Wygrywasz, właśnie tego szukam. Dzięki! –

0

To powinno działać dla Ciebie ...

class ActionView::Helpers::FormBuilder 
    def dow_time(dow_model, time, options={}) 
    rval = select(dowmodel, :dow, DateTime::DAYNAMES) 
    rval += time_select(time, {:minute_step => 15, :ignore_date => false, :twelve_hour => true}) 
    end 
end 
+0

self.read_attribute nie powiedzie się z: niezdefiniowanej metody 'read_attribute” dla # "modelinstance" nie działa, ponieważ model jest zmienna, a może jestem nieporozumienie co Ty mówisz. –

+0

Edytowałem kod. Wywołaj go za pomocą: <% = dow_time (@model, czas itd.)%> –

+0

Pomógł dużo! Dzięki. :) –