2009-10-18 7 views
0

Je cherche un exemple de création d'un générateur de formulaire personnalisé pour une liste de boutons radio liée à un objet act_as_tree. J'ai déjà le code qui affiche la liste des boutons radio, mais que je veux sécher en refactoring dans un formbuilder. Je ne trouve aucun exemple de générateur de formulaire personnalisé pour les listes de boutons radio.Exemple de constructeur de rails personnalisé pour une liste de boutons radio

Des pointeurs/liens seraient appréciés.

Répondre

2

En supposant que vous appelez form_for sur ce modèle souvent à partir de nombreux points de vue différents et chaque formulaire aura le même ensemble de boutons radio. Il y a quelques routes que vous pouvez prendre ici. Cependant, je ne sais pas si vous demandez comment ajouter automatiquement la liste des boutons radio ou simplement la condenser. L'ajout de la liste des boutons radio nécessite automatiquement un peu plus de connaissances sur les composants internes d'ActionView que je ne peux partager. Essentiellement, vous voudrez comprendre comment les choses sont rendues et remplacer la méthode fields_for dans ActionView :: Helpers :: FormHelper pour qu'elle fonctionne correctement. Malheureusement, FormBuilders ne fonctionne pas de cette façon. Donc, ça va être beaucoup plus de problèmes que ça en vaut la peine.

Une meilleure approche consiste à créer une méthode qui génère tous vos boutons radio dans votre générateur de formulaire personnalisé. Pour garder les choses simples en cas de changement, nous allons ajouter une constante au modèle. J'ai arbitrairement décidé qu'il s'agirait d'un hachage où chaque clé est une méthode d'attribut que vous voulez représenter avec une liste de boutons radio dans des formulaires, et chaque valeur est une liste de valeurs acceptables pour cet attribut. Cela simplifie la génération de plusieurs listes de boutons radio sans avoir à modifier le générateur de formulaire. P.S. Vous pouvez également utiliser le hachage pour valider le contenu de tout attribut associé à des boutons radio.

/app/models/example.rb

class Example < ActiveRecord::Base 
    ... 
    RADIO_BUTTON_HASH = { 
    :attribute_a => [:accepted_value_a1, :accepted_value_a2, :accepted_value_a3], 
    :attribute_b => [:accepted_value_b1, :accepted_value_b2], 
    ... 
    } 


    def self.radio_buttons_sort(a,b) 
    # sort method to ensure that multiple radio buttons lists appear in the order you want 
    end 

    def self.radio_buttons_sorted 
    RADIO_BUTTON_HASH.sort{|a,b| radio_button_sort(a,b)} 
    end 
    ... 
end 

J'ai ajouté quelques méthodes pratiques en plus du hachage, ils ne sont pas nécessaires, mais ils offrent une méthode plus propre de normaliser la production.

**/app/helpers/example_helper.rb Module ExampleHelper

# the custom FormBuilder 
    class ExampleFormBuilder < ActionView::Helpers::FormBuilder  

    # add onkeypress and set maxlength of field to 3 to all text fields 
    def radio_button_list(options={}) 
     Example.sorted_radio_buttons.each do |method,values| 
     values.each do |value| 
      radio_button(method, value, options) 
     end 
     end 
    end 

    end 
end 

ensuite d'une vue où ExampleHelper est inclus (fait par défaut dans une vue rendue par le contrôleur exemple).

<%form_for @example, :builder => ExampleFormBuilder do |f| %> 
    ... 

    <%=f.radio_button_list %> 
<%end%> 
+0

Merci pour votre réponse. J'ai passé quelques heures à essayer de résoudre le problème la nuit dernière en passant par les assistants des rails et j'ai finalement trouvé une solution similaire. – Damian

+0

Oui, la documentation officielle n'est pas très utile sur ce sujet. La version courte est que vous utilisez FormBuilders personnalisé pour remplacer les méthodes FormHelper avec vos options ou créer de nouvelles méthodes d'assistance. – EmFi

Questions connexes