2010-03-19 29 views
2

J'essaye de SECHER un code en déplaçant de la logique dans FormBuilder. Après avoir lu la documentation sur la façon de sélectionner et de créer un formulaire alternatif, la solution logique pour moi semblait être quelque chose comme ça.Essayer d'étendre ActionView :: Helpers :: FormBuilder

De l'avis

<% form_for @event, :builder => TestFormBuilder do |f| %> 
    <%= f.test %> 
    <%= f.submit 'Update' %> 
<% end %> 

puis dans app/helpers/application_helper.rb

module ApplicationHelper 
    class TestFormBuilder < ActionView::Helpers::FormBuilder 
     def test 
      puts 'apa' 
     end 
    end 
end 

Ceci, cependant, me donne une erreur au "form_for"

uninitialized constant ActionView::Base::CompiledTemplates::TestFormBuilder 

Où est-ce que je fais mal?

Répondre

5

essayer avec:

form_for @event, :builder => ApplicationHelper::TestFormBuilder do |f| 
+0

Merci. Ça a marché. Est-ce documenté quelque part ou ai-je manqué quelque chose dans la structure des rails? –

+0

Vous devez définir une classe. Vous n'avez donc pas besoin de le placer dans votre ApplicationHelper. Vous pouvez donc placer votre classe dans votre bibliothèque et l'utiliser sans espace de noms. – shingara

+0

Existe-t-il un moyen plus élégant que celui-ci? – JohnMerlino

4

classe Builder peut être placé dans le fichier du module, à l'intérieur et/ou définition du module extérieur, comme celui-ci:

# app/helpers/events_helper.rb 
    module EventsHelper 
     ... 
     class FormBuilderIn < ActionView::Helpers::FormBuilder 
      ... 
     end 
    end 
    class FormBuilderOut < ActionView::Helpers::FormBuilder 
     ... 
    end 

Une bonne façon de constructeur attacher à former est la suivante:

# app/views/events/_form_in.html.erb 
    form_for @event, :builder => EventsHelper::FormBuilderIn do |f| 

    # app/views/events/_form_out.html.erb 
    form_for @event, :builder => FormBuilderOut do |f| 

Voici méthode d'assistance pour la mise en option de constructeur sur le formulaire:

# app/helpers/events_helper.rb 
    module EventsHelper 
     def form_in_for(data, *args, &proc) 
      options = args.extract_options! 
      form_for(data, *(args << options.merge(:builder => EventsHelper::FormBuilderIn)), &proc) 
     end 
     def form_out_for(data, *args, &proc) 
      options = args.extract_options! 
      form_for(data, *(args << options.merge(:builder => FormBuilderOut)), &proc) 
     end 
    end 
    ... 

Maintenant, il est ainsi en option pour attacher le constructeur à la forme:

# app/views/events/_form_in.html.erb 
    form_in_for @event do |f| 

    # app/views/events/_form_out.html.erb 
    form_out_for @event do |f| 

Enfin, les constructeurs personnalisés peuvent être placés dans le dossier séparé, par exemple « app/constructeurs », mais cela exige d'ajouter manuellement ce chemin dans l'environnement de l'application. Pour Rails 2.3.x, définissez:

# config/environment.rb. 
    config.load_paths += %W(#{RAILS_ROOT}/app/builders)