6

我对我当前的项目有一个看法,它执行以下操作(在 haml 中):

-@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

这将生成工作代码,但它确实会为所有表单元素生成具有相同 id 的表单,这会在第二次呈现投票框部分时使 HTML 无效。

我解决这个问题的第一个猜测是为 form_for 指定一个唯一的 :id ,但这仅适用于 form_for 生成的表单标签,而不适用于 form_for 块内的任何标签。

这个问题的一个明确解决方案是在 form_for 和我使用的所有表单元素上手动定义我自己的唯一 ID。这比我希望的要多。

是否有一种更简单或更简洁的方法来获取与 Rails 当前在我的所有表单元素上生成它们的方式类似的格式的唯一 ID?

4

2 回答 2

2

我已删除原始答案,因为它与问题的更新版本完全无关。

更新:所以现在我们知道您有一个未保存的 ActiveRecord 对象传递给form_for调用,答案很简单:您可以覆盖任何form_for生成的参数。这包括元素 id。并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
    …
于 2010-10-31T18:34:36.073 回答
2

您可以使用以下内容覆盖所有内容的自动生成id的 s 和s :nameform_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.nameis foobar,它将生成一个注释字段,其idisfoobar_comment和 name 是foobar[comment]

但请记住确保动态参数可以作为 html id 接受,horse.namelikehor$e不能作为 html id 接受,因此可能会破坏某些内容。

PS:很抱歉回答得很晚,但是在提出问题的时候,我还没有学到任何关于rails的东西!希望这可以帮助那里的人!

于 2013-05-18T22:24:39.397 回答