2009-06-01 5 views
7

Je travaille sur un projet qui a des événements hebdomadaires récurrents. Ainsi, j'utilise plusieurs champs DateTime d'une manière non traditionnelle. Ce sur quoi je travaille est un FormBuilder qui crée un champ qui génère un select pour un jour de la semaine, et un select pour l'heure. J'utilise un plugin de douze heures que j'ai trouvé en ligne, de sorte que fonctionne:Rails Formbuilder Question

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 

Le problème que je vais avoir est que le jour de la semaine de sélection n'a pas en fait une valeur sélectionnée par défaut. Cela fonctionne très bien sur mes pages de création, mais pas sur les pages d'édition. dow est un symbole qui référence le champ dans le modèle appelant où la chaîne du jour de la semaine est "lundi", "mardi", etc. Comment puis-je extraire cette valeur du modèle appelant en utilisant dow.

self[dow] 

Ne fonctionne pas car il s'agit d'une classe différente.

Des idées? Quelque chose de différent?

Répondre

13

Si vous êtes dans un FormBuilder, alors vous pouvez accéder à l'objet en cours en utilisant simplement la variable « objet ».

Ex:

Dans: edit.html.erb

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

Dans votre FormBuilder

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

Les deux object et object_name sont fixés pour vous lorsque vous appelez form_for.

Voir actionpack/lib/action_view/helpers/form_helper.rb pour plus de détails.

+0

Vous gagnez, c'est exactement ce que je cherche. Merci! –

0

Cela devrait fonctionner pour vous ...

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 échoue avec: méthode non définie de read_attribute » pour # "modelinstance" ne fonctionne pas parce que le modèle est variable, ou peut-être que je suis malentendu ce vous dites. –

+0

J'ai modifié le code. Appelez-le avec: <% = dow_time (@mymodel, time, etc ...)%> –

+0

A beaucoup aidé! Merci. :) –