2010-03-11 4 views
5

J'ai une application de rails qui affiche une liste d'éléments appelés modules. Je suis en train d'itérer sur ceux-ci, en rendant un partiel pour chacun qui inclut un remote_form_for call.remote_form_for multiples sur la même page provoque ids double

tout cela fonctionne, mais échoue de validation HTML parce que mon texte des champs de formulaire ont tous le même id.

Est-il: option de préfixe sur la forme (ou autre chose) je peux utiliser pour contourner ce problème?

Mise à jour:
(un code)

//_module_form.html.erb 
    <% remote_form_for app_module do |f| %> 
     <%= f.label :name %> 
     <%= f.text_field :name %> 
     <%= submit_tag 'Save' %> 
    <%end %> 

    //parent page 
    <% @thing.modules.each do |app_module| %> 
     <%= render :partial => "module_form", :locals => { :app_module => app_module } %> 
    <% end %> 

Donc, si j'ai plus de 1 point dans la collection, je rendre la forme identique sur la même page, et l'id id forme et zone de texte sont dupliquées .

Je peux personnaliser assez facilement la forme id, mais quid du text_box, puisque le contrôleur est à la recherche des contrôles spécifiques nommés?

+0

Nous avons besoin du code pour comprendre – shingara

+0

Pouvez-vous ajouter votre code à la question? – klew

+0

Ajout d'un peu de code. –

Répondre

2

Ajouter le :index => object.id au hachage d'options lors de la création de votre formulaire. Cela devrait générer des identifiants sous la forme object_id_attribute sans interférer avec le contrôleur.

Modifier

La documentation concernant :index est trompeur est ambigüe. :index a un effet sur la soumission du formulaire. La solution consiste à spécifier l'attribut :id pour chaque champ. Cela va changer la propriété id, laissant name indemne (ce qui compte pour la soumission).

Voici le code que je l'utilise dans une aide générique pour générer ces champs:

def create_field(f, field_type, object, field_name) 
    field_id = "#{object.class.name.downcase}_#{object.id.to_s}_#{field_name.to_s}" 
    f.send(field_type, field_name, :id => field_id) 
end 
1

itérer sur eux avec collection.each_with_index do |item, i| alors sur le rendu passe partiel dans une variable locale:

render :partial => "some_partial", :locals => {:form_id => "form_id_#{i}"} 

Ensuite, dans la partie, vous pouvez accéder à <%= form_id %>

Ce serait une façon de le faire.

Je suppose dans le remote_form_for vous pouvez passer: id => form_id ou: html_options => {: id => form_id}

On dirait que vous pouvez, voir: http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html#M001649

+0

qui adresse mon ID de formulaire en double, mais qu'en est-il des identifiants de zone de texte? –

+0

Vous pouvez définir l'ID dans le champ text_field de la même manière en transmettant: id à l'assistant text_field. L'attribut name sur les champs de saisie devrait être pris en charge par l'assistant de formulaire de toute façon. Pourquoi ne pas faire utiliser quelque chose comme:. Id => « app_module _ # {} app_module.id _name » – tsdbrown

+0

Si je fais cela, correctement mon contrôleur ne fonctionne plus, car il ne comprend pas les params qui sont affichées dans –

Questions connexes