Генерация уникальных HTML-идентификаторов в Rails при использовании повторного партиала, имеющего form_for - PullRequest
5 голосов
/ 31 октября 2010

У меня есть вид на мой текущий проект, который делает что-то вроде следующего (в хамле):

-@horses.each do |horse|
  = render :partial => 'main/votingbox', :locals => {:horse => horse}

В файле _votingbox.html.haml у меня есть следующее:

%div.votingbox
  %span.name= horse.name
  %div.genders
    - if horse.male
      %img{:src => 'images/male.png', :alt => 'Male'} 
    - if horse.female
      %img{:src => 'images/female.png', :alt => 'Female'}
  %div.voting_form
    = form_for(Vote.new, {:url => horse_vote_path(horse)}) do |f|
      = f.label :comment, "Your opinion"
      = f.text_field :comment
      ...
      a bunch of labels and input elements follow generated using the form helpers

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

Мое первое предположение об исправлении этогодолжен был указать уникальный: id для form_for, но это относится только к тегу формы, сгенерированному form_for, а не к любому из тегов внутри блока form_for.

Одно определенное решение этой проблемы - пройти и вручную определитьмои собственные уникальные идентификаторы на form_for и все элементы формы, которые я использую.Это больше работы, чем я рассчитывал.

Есть ли более простой или понятный способ получения уникальных идентификаторов в формате, аналогичном тому, который в настоящее время Rails генерирует их для всех моих элементов формы?

Ответы [ 2 ]

1 голос
/ 19 мая 2013

Вы можете переопределить автоматически сгенерированные id s и name s всего form_for содержимого с помощью :as, как показано ниже:

= form_for(Vote.new, :as => horse.name, {:url => horse_vote_path(horse)}) do |f|
  = f.label :comment, "Your opinion"
  = f.text_field :comment

Так что если данный horse.name равен foobar, он сгенерирует поле комментария, для которого id равно foobar_comment и имя foobar[comment]

Но не забудьте убедиться, что динамический параметр приемлем в качестве идентификатора html, horse.name как hor$e неприемлемо в качестве html-идентификатора и, следовательно, может что-то сломать.

PS: Извините за очень поздний ответ, но на момент, когда был задан вопрос, я так и не узналчто-нибудь о рельсах!надеюсь, что это поможет кому-то там!

1 голос
/ 31 октября 2010

Я удалил исходный ответ, поскольку он совершенно не имеет отношения к обновленной версии вопроса.

Обновление: Итак, теперь мы знаем, что у вас есть несохраненный объект ActiveRecord, переданный в вызов form_for, ответ становится простым: вы можете переопределить любой параметр, который генерирует form_for. Это включает в себя идентификатор элемента. И fields_for устанавливает контекст для конкретной записи.

= form_for(Vote.new, :url => horse_vote_path(horse), :id => dom_id(horse, 'vote')) do |f|
  = f.fields_for horse, :index => horse do |fh|
    = fh.text_field :whatever
    …
...