2010-03-11 23 views
5

Tengo una aplicación de rieles que muestra una lista de elementos llamados módulos. Estoy iterando sobre estos, representando un parcial para cada uno que incluye una llamada remote_form_for.Varios remote_form_for en la misma página causa identificaciones duplicadas

Todo esto funciona, pero no pasa la validación HTML porque mi forma de texto en campos de todo tiene el mismo ID.

¿Existe la opción: prefijo en el formulario (o algo más) que puede utilizar para evitar esto?

Actualización:
(algo de código)

//_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 %> 

Así que si tengo más de 1 elemento de la colección, pagaré la forma idéntica en la misma página, y la forma de identificación y cuadro de texto ID están duplicados .

Puedo personalizar el ID del formulario con bastante facilidad, pero ¿qué ocurre con el cuadro de texto, ya que el controlador está buscando controles específicos con nombre?

+0

necesitamos un poco de código para entender – shingara

+0

se puede añadir el código a la pregunta? – klew

+0

Agregó un código. –

Respuesta

2

Agregar :index => object.id al hash de opciones al crear su formulario. Esto debería generar identificadores en forma de object_id_attribute sin interferir con el controlador.

Editar

La documentación relativa a :index es ambigua es engañosa. :index tiene un efecto en el envío del formulario. La solución es especificar el atributo :id para cada campo. Esto cambiará la propiedad id, dejando name ileso (que es lo que cuenta para el envío).

Este es el código que utilizo en un ayudante genérico para la generación de estos campos:

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

Iterar sobre ellos con collection.each_with_index do |item, i| después en el render pase parcial en una variable local:

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

A continuación, en el parcial se puede acceder <%= form_id %>

Eso sería una manera de hacerlo.

Asumo en el remote_form_for puede pasar en: id => form_id o: html_options => {: id => form_id}

parece que se puede ver: http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html#M001649

+0

que se dirige a mi identificador de formulario duplicado, pero ¿qué pasa con los identificadores de cuadro de texto? –

+0

Puede establecer la identificación en text_field de manera similar, pasando in: id al text_field helper. El atributo de nombre en los campos de entrada debe ser atendido por el asistente de formulario de todos modos. ¿Por qué no utilizar algo como: id => "app_module _ # {app_module.id} _name" – tsdbrown

+0

Si hago eso, mi controlador ya no funciona correctamente, porque no comprende los parámetros que se publican en. –

Cuestiones relacionadas