我对我当前的项目有一个看法,其中包含以下内容(以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?
答案 0 :(得分:1)
我删除了原始答案,因为它与问题的更新版本完全无关。
更新:现在我们知道您有一个未保存的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
…
答案 1 :(得分:1)
您可以使用id
覆盖所有name
内容的自动生成的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 id可以接受,horse.name
之类的hor$e
不能作为html id接受,因此可能会破坏某些内容。
P.S:很抱歉很晚才回答,但当问到这个问题时,我还没有学到任何关于rails的信息!希望可以帮助那里的人!