代码之家  ›  专栏  ›  技术社区  ›  Ben Scheirman

同一页上的多个远程窗体导致重复的ID

  •  6
  • Ben Scheirman  · 技术社区  · 14 年前

    我有一个rails应用程序,它显示一个名为modules的项目列表。我正在迭代这些,为每个包含远程表单的调用呈现一个部分。

    这一切都有效,但html验证失败,因为我的表单文本字段都具有相同的id。

    表单上是否有:prefix选项(或其他选项)可以用来解决这个问题?

    更新:
    (一些代码)

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

    因此,如果集合中有多个项,则在同一页上呈现相同的表单,并且表单ID和文本框ID重复。

    我可以很容易地定制表单id,但是文本框呢,因为控制器正在寻找特定的命名控件?

    2 回复  |  直到 14 年前
        1
  •  2
  •   shmichael    14 年前

    添加 :index => object.id 创建表单时的选项哈希。这将生成以下形式的id object_id_attribute 不干扰控制器。

    编辑

    关于 :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
    
        2
  •  1
  •   tsdbrown    14 年前

    在它们上面迭代 collection.each_with_index do |item, i| 然后在局部变量中的render partial pass上:

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

    然后在部分中,您可以访问 <%= form_id %>

    那将是一种方法。

    我假设您可以在远程表单中传入:id=>表单id或:html\u options=>{:id=>表单id}

    看起来你可以看到: http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html#M001649