2013-02-24 4 views
1

Est-ce que quelqu'un sait s'il existe une solution simple pour ajouter dynamiquement de nouvelles options à un menu de sélection dans un formulaire dans Rails? Le railcast de formes dynamiques (http://railscasts.com/episodes/403-dynamic-forms) est axé sur le filtrage dynamique d'un second menu de sélection basé sur la sélection effectuée dans un autre menu de sélection qui n'est pas ce que je recherche. Je cherche une solution où le formulaire contient seulement un menu de sélection et de nouvelles options peuvent être ajoutées sur le formulaire. Je pense que la solution peut être similaire à celle abordée dans le railcast de modèle imbriqué (http://railscasts.com/episodes/196-nested-model-form-revised) mais dans cet exemple, le formulaire doit être soumis avant que les valeurs ne soient mises à jour dans la base de données. Je voudrais que l'utilisateur puisse ajouter une nouvelle option de menu, puis continuer avec le reste du formulaire avant de le soumettre.Comment ajouter dynamiquement une option de menu select dans Rails

À ce stade, je voudrais également éviter d'utiliser la solution de mise en autocomplétion jquery de railscast car cela utilise un champ de texte plutôt qu'un menu de sélection.

Actuellement, je vois la solution comme ayant un bouton "Ajouter nouveau" à côté du menu de sélection. Lorsque le bouton est cliqué, un modal est ouvert qui permet à l'utilisateur d'entrer dans la nouvelle option de menu de sélection, puis enregistrer (mettre à jour la base de données), le modal est fermé et le formulaire est mis à jour. Je me demande simplement si une solution élégante existe déjà.

Toute aide serait grandement appréciée.

Merci.

MISE À JOUR:

Je n'ai pas créé de code pour mettre en œuvre ce encore, mais voici ma forme:

<%= simple_form_for @other, :html => { :class => 'form-horizontal' } do |f| %> 
<fieldset> 
    <%= f.error_notification %>   
    <%= f.association :other_type, :include_blank => false %>  
    <%= f.input :cost%> 
    <%= f.input :invoice %>    
    <%= f.input :notes, :input_html => {:class => "row-fluid"} %> 
<%= f.error :base %> 
<div id="eze_form_actions" class="form-actions"> 
    <%= f.submit nil, :class => 'btn btn-primary' %> 
    <%= link_to 'Cancel', others_path, :class => 'btn' %> 
</div> 
</fieldset>  
<% end %> 
+1

Publiez votre code aussi – Shail

+0

Avec un peu de magie javascript, vous pouvez le faire ressembler exactement à des formes dynamiques et toutes ces gemmes ... – gmaliar

+0

Ok, je suis un peu un débutant, donc s'il n'y a pas de solution existante, cela signifie J'ai un peu de lecture à faire sur la façon de l'implémenter avec javascript. Merci de votre aide. – Marklar

Répondre

1

Je l'ai fait quelque chose de semblable à cela pour les catégories dans notre CMS, les utilisateurs peuvent ajouter facilement une nouvelle catégorie et nous POST au serveur, qui répond avec HTML (rendre à travers un partiel) et nous l'injectons dans notre ensemble de cases à cocher. Vous pouvez facilement reproduire ce pour vos besoins:

Pour que cela fonctionne, vous aurez besoin de votre forme, un point final et javascript:

Formulaire

Je ne sais pas ce que vous êtes Le formulaire inclura, mais utilisera des aides de formulaire régulières et s'assurera que le formulaire est défini sur remote: true.

End Point

Votre point final devrait rendre une partielle, qui ne doit contenir le code html pour le .. que nous allons rendions à une chaîne et passe en retrait à la fin avant d'ajouter.

def endpoint 
    # create your new model with the params 
    @model = Model.create(some: attribute) 
    if @model.errors.empty and @model.save 
    render json: { html: render_to_string(partial: "path/to/partial", locals: { model: @model }) 
    end 
end 

** JavaScript **

$(form) 
    .bind('ajax:success', function(data, status) { 
    $(select).append(status.html) 
    }) 

status.html devrait être quelque chose comme <option>...</option> et donc nous ajoutons simplement à notre sélection. Faites-moi savoir si cela n'a pas de sens. J'espère que ça aide.

+0

Merci beaucoup d'avoir pris le temps d'aider. Je n'ai jamais entendu parler d'un point de terminaison avant et la meilleure définition que j'ai pu trouver était "Un point de terminaison de Rack est juste une application qui adhère à la spécification de Rack". Où dans mon projet dois-je mettre mon point final? Avez-vous un exemple sur GitHub? – Marklar

+0

Et point de terminaison est juste une route, comme '/ chemin/to/endpoint' que vous postez vos données. Dans votre cas, c'est ce que cela rend à 'simple_form_for @ other'. Cela a-t-il du sens? – johnkoht

+0

Je fais de mon mieux pour rester ici. Mon formulaire ne doit-il pas rester inchangé, je peux donc le soumettre normalement pour ajouter un nouvel élément, etc. Le menu de sélection soumet-il son propre formulaire? – Marklar

Questions connexes