2010-03-11 51 views
5

我有一個rails應用程序,它顯示了一個名爲模塊的項目列表。我正在對這些進行迭代,爲每個包含remote_form_for調用的部分渲染一個部分。在同一頁面上的多個remote_form_for會導致重複的ID

這一切都有效,但HTML驗證失敗,因爲我的表單文本字段都具有相同的ID。

我可以用來解決這個問題的窗體(或其他)上有一個前綴選項嗎?

更新:
(一些代碼)

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

所以,如果我在集合中有超過1項,我呈現在同一頁上以同樣的形式,以及形式ID和文本框的ID被複制。

我可以很容易地自定義表單ID,但是text_box怎麼樣,因爲控制器正在尋找特定的命名控件?

+0

我們需要一些代碼來了解 – shingara 2010-03-11 14:38:20

+0

您可以將您的代碼的問題? – klew 2010-03-11 14:38:50

+0

增加了一些代碼。 – 2010-03-11 20:00:20

回答

2

添加在創建表單時將:index => object.id設置爲選項散列。這應該以object_id_attribute的形式生成ID,而不會干擾控制器。

編輯

關於: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

遍歷他們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

+0

可以解決我的重複表單ID,但是textbox ID呢? – 2010-03-11 19:45:31

+0

通過將id傳遞給text_field助手,可以以類似的方式在text_field中設置id。無論如何,輸入字段上的名稱屬性應該由表單助手來處理。爲什麼不使用類似如下的代碼:id =>「app_module _#{app_module.id} _name」 – tsdbrown 2010-03-12 09:20:48

+0

如果我這樣做了,我的控制器就不能正常工作,因爲它不理解發布的參數 – 2010-03-17 12:52:45

相關問題