2010-03-11 15 views
5

Mam aplikację szyny, która wyświetla listę elementów zwanych modułami. I iterating nad nimi, renderowanie częściowe dla każdego, który zawiera wywołanie remote_form_for.Wiele remote_form_for na tej samej stronie powoduje duplikowanie identyfikatorów

To wszystko działa, ale nie sprawdza poprawności HTML, ponieważ wszystkie pola tekstowe formularza mają ten sam identyfikator.

Czy istnieje opcja: prefiks w formularzu (lub coś innego) Czy mogę użyć tego do obejścia tego?

Aktualizacja:
(niektóre kod)

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

Więc jeśli mam więcej niż 1 element w kolekcji, I renderowania identyczną formę na tej samej stronie, a forma id i pola tekstowego identyfikatora są duplikowane .

Mogę łatwo dostosować identyfikator formularza, ale co z polem tekstowym, ponieważ kontroler szuka określonych nazwanych kontrolek?

+0

Musimy trochę kodu do zrozumienia – shingara

+0

można dodać kod do pytania? – klew

+0

Dodano kod. –

Odpowiedz

2

Dodaj :index => object.id do skrótu opcji podczas tworzenia formularza. Powinno to wygenerować identyfikatory w postaci object_id_attribute bez ingerencji w kontroler.

Edit

Dokumentacja dotycząca :index to jest niejednoznacznie mylące. :index ma wpływ na przesłanie formularza. Rozwiązaniem jest określenie atrybutu :id dla każdego pola. Spowoduje to zmianę właściwości id, pozostawiając nietkniętą name (co jest ważne dla przesłania).

Oto kod używam w ogólnej pomocnika do generowania tych pól:

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

Iterate nad nimi z collection.each_with_index do |item, i| następnie na renderowanie częściowego przejścia w zmiennej lokalnej:

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

Następnie w częściowe można uzyskać dostęp <%= form_id %>

To byłby jeden ze sposobów, aby to zrobić.

Jestem zakładając w remote_form_for można przekazać w: id => form_id czyli html_options => {: id => form_id}

Wygląda na to można znaleźć: http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html#M001649

+0

który dotyczy mojego duplikatu id formularza, ale co z identyfikatorami pola tekstowego? –

+0

Możesz ustawić identyfikator w polu tekstowym w podobny sposób, przekazując: id do helpera text_field. Atrybut name w polach wejściowych powinien być tak czy inaczej obsługiwany przez helpera formularza. Dlaczego nie użyć czegoś takiego jak: id => "app_module _ # {app_module.id} _name" – tsdbrown

+0

Jeśli to zrobię, mój kontroler przestanie działać poprawnie, ponieważ nie rozumie wprowadzonych parametrów. –

Powiązane problemy