Несколько remote_form_for на одной странице приводит к дублированию идентификаторов - PullRequest
6 голосов
/ 11 марта 2010

У меня есть приложение rails, которое отображает список элементов, называемых модулями. Я перебираю их, отрисовывая частичные для каждого, который включает вызов remote_form_for.

Это все работает, но не проходит проверку HTML, потому что все текстовые поля моей формы имеют одинаковый идентификатор.

Есть ли в форме опция: префикс (или что-то еще), которую я могу использовать, чтобы обойти это?

Обновление:
(некоторый код)

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

Таким образом, если у меня в коллекции более одного элемента, я отображаю идентичную форму на той же странице, а идентификатор формы и идентификатор текстового поля дублируются.

Я могу довольно легко настроить идентификатор формы, но как насчет text_box, поскольку контроллер ищет определенные именованные элементы управления?

Ответы [ 2 ]

2 голосов
/ 13 июля 2010

Добавьте :index => object.id к хэшу опций при создании формы. Это должно генерировать идентификаторы в форме object_id_attribute, не мешая контроллеру.

Редактировать

Документация, касающаяся :index, вводит в заблуждение. :index влияет на отправку формы. Решение состоит в том, чтобы указать атрибут :id для каждого поля. Это изменит свойство id, оставляя name целым и невредимым (что и учитывается при отправке).

Вот код, который я использую в универсальном помощнике для генерации этих полей:

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 голос
/ 11 марта 2010

Итерируйте их с помощью collection.each_with_index do |item, i|, затем при частичном проходе рендеринга в локальной переменной:

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

Тогда в частичном вы можете получить доступ <%= form_id %>

Это был бы один из способов сделать это.

Я предполагаю, что в remote_form_for вы можете передать: id => form_id или: html_options => {: id => form_id}

Похоже, вы можете увидеть: http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html#M001649

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...