2010-05-18 38 views
14

包裝<%= f.check_box%>我有一個窗體上的複選框列表。由於CSS的結構化方式,標籤元素的直接風格。這需要我將複選框嵌套在標籤內。<label>

這個工作原始的HTML,如果你點擊標籤文本,複選框的狀態改變。然而,它不能與導軌<%= f.check_box %>協同工作,因爲它首先輸出一個隱藏的輸入標籤。

綜上所述,

<label> 
    <%= f.check_box :foo %> 
    Foo 
</label> 

這是輸出I

<label> 
    <input type="checkbox" ... /> 
    <input type="hidden" ... /> 
    Foo 
</label> 

...但是什麼Rails是給我:

<label> 
    <input type="hidden" ... /> 
    <input type="checkbox" ... /> 
    Foo 
</label> 

因此,標籤行爲不會執行lly工作:(。

有什麼辦法可以解決這個問題嗎?

+0

所以當嵌套一個'''

+0

這是正確的,但是nfm注意到訂單是敏感的,並且實際上不會以其他方式工作。 – 2010-05-19 03:07:15

回答

7

Rails在複選框之前生成隱藏的輸入,因爲它需要一種方法來知道表單是否未被選中複選框提交。 的訂單是,因爲如果複選框被選中,將覆蓋隱藏的輸入。詳細信息請參見Rails API

您應該使用<label for="checkbox_id">而不是將複選框包裝在標籤標籤中。

+1

這是我最終做的,但似乎沒有必要提供自己的:id到複選框,以便我可以在標籤中使用它。感謝_why_上的信息。 – 2010-05-19 03:05:41

+2

Twitter Bootstrap使用此嵌套語法。 – Jan 2013-09-09 12:50:44

-3

這不是使用label標籤的方式。相反,使用這樣的:

<input type="hidden" ... /> <!-- doesn't really matter where these are --> 

<label for="id_of_element">Foo</label> 
<input type="checkbox" id="id_of_element" ... />

現在「富」充當複選框元素的標籤,你可以在「富」單擊以選中或取消選中它。

+9

這是使用'label'標籤的完全可以接受的方式。請看這裏:http://www.w3.org/TR/html401/interact/forms.html#h-17.9.1特別是這個:「for = idref [CS]。這個屬性明確地將被定義的標籤與另一個控件相關聯當存在時,該屬性的值必須與同一文檔中某個其他控件的id屬性的值相同。當缺席時,被定義的標籤與元素的內容相關聯。「*編輯*:我將離開我的HTML高馬&給你,這是一個地方,Rails是不符合正確使用的標籤' – Ben 2010-05-18 22:13:03

37

這個工作對我來說:

<%= f.label :foo do %> 
    <%= f.check_box :foo %> 
    Foo 
<% end %> 

呈現:

<label for="foo"> 
    <input name="foo" type="hidden" value="0"> 
    <input checked="checked" id="foo" name="foo" type="checkbox" value="1"> 
    Foo 
</label> 
+1

似乎在這種情況下,沒有機會使用自動音譯,如http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-label。對不起,對不起英語。 – woto 2013-09-23 06:54:59

0

這是我使用包括翻譯的解決方案。

<%= 
    f.label(
    :foo, 
    "#{f.check_box(:foo)} #{t('helpers.label.foo')}".html_safe 
) 
%> 

在en.yml

en: 
    helpers: 
    label: 
     foo: Foo