2017-04-05 47 views
2

在我們的應用中,我們顯示,像這樣投入的一部分:Rails的label_tag做幫手只呈現內容

<%= f.label :date, class: 'field' do %> 
    <span>Date</span> 
    <%= f.text_field :date %> 
<% end %> 

這被重複很多時候,所以我決定把它放在一個幫手裏面像這樣:

def text_field_for(attribute, title, form, value = nil) 
    form.label attribute, class: 'field' do 
    content_tag(:span, title) 
    form.text_field attribute, value: value 
    end 
end 

但是這撕心裂肺的HTML如下:

<label class="field" for="my_object_date"> 
    <input type="text" name="my_object[date]" id="my_object_date" /> 
</label> 

爲什麼它不渲染span標籤?當我註釋掉text_field時,它正確地呈現了跨度。不知何故,它不能同時渲染它們。

回答

2

兩行之前添加concat在你的方法象下面這樣:

def text_field_for(attribute, title, form, value = nil) 
    form.label attribute, class: 'field' do 
    concat(content_tag(:span, title)) 
    concat(form.text_field attribute, value: value) 
    end 
end 

如果使用CONCAT它將加入每個HTML您在標籤塊中生成的塊。

沒有它,我只把最後一行作爲內容。 (像return form.text_field attribute, value: value

0

當您製作自己的幫手時,您需要使用concat才能爲該塊添加額外的內容。

像這樣的東西應該工作:

def text_field_for(attribute, title, form, value = nil) 
    form.label attribute, class: 'field' do 
    concat(content_tag(:span, title)) 
    concat(form.text_field attribute, value: value) 
    end 
end 

的毗連將內容添加到與<%= content %>將如何做一個模板文件類似的輸出緩衝區。

如果你以後想要做這樣的事情,但你沒有一個塊,你需要使用capture,以便內容被捕獲並呈現給頁面。

def another_helper 
    capture do 
    concat link_to("Star wars", star_wars_path) 
    concat link_to("Star trek", star_trek_path) 
    end 
end 
0

只有最後一條語句從塊返回。您可以通過將二者結合起來的:

form.label attribute, class: 'field' do 
    content_tag(:span, title) + form.text_field(attribute, value: 'bar') 
end 

form.label attribute, class: 'field' do 
    content_tag(:span, title).concat(form.text_field(attribute, value: 'bar')) 
end