2009-09-04 206 views
17

我可能在此處缺少一些明顯的內容,但這裏是我正在嘗試執行的操作。幫助程序文件中的Rails視圖幫助程序

從視圖,我打電話給一個自定義的輔助函數

<div> 
    <%=display_services%> 
</div> 

在幫助文件與display_services功能

def display_services 
    html = "<div>" 
    form_for @user do |f| 
    f.text_field ... 
    end 
html << "</div>" 
end 

我發現的form_for方法,並直接向f.text_field輸出沒有我喜歡的div封裝的HTML流。在display_services中輸出所有HTML的正確語法是什麼?在此先感謝您的幫助。

回答

22

只是爲了風格的建議,我喜歡做這樣的事情:

在你看來:

<% display_services %> 

請注意:=不需要任何更多。 助手然後使用concat()追加的東西到你的頁面,並放置的長串在一起的東西是過時太:

def display_services 
    concat("<div>") 
    form_for @user do |f| 
    f.text_field ... 
    end 
    concat("</div>") 
end 

是否nessaccary把<div>標籤進入幫手。如果你需要一個幫手嵌入一些成塊,你可以使用一些產量魔法以及:

def block_helper 
    concat("<div>") 
    yield 
    concat("</div>") 
end 

而且在你看來這樣使用它 - 與助手當然也:

<% block_helper do %> 
    cool block<br/> 
    <% display_services %> 
<% end %> 
+0

甜,我喜歡你的解決方案更好,它更乾淨,謝謝。 – Bob

+2

另一個需要注意的地方是,如果你希望你的HTML看起來很漂亮,並且「\ n」到concat的結尾。 – Bob

5

事實證明,我不得不做這樣的事情

def display_services 
    html = "<div>" 
    html << (form_for @user do |f| 
    f.text_field ... 
    end) 
    html << "</div>" 
end 

注意()纏型塊。如果有人有更好的解決方案,請告訴我。

30

恕我直言,你不應該在Ruby代碼中硬編碼HTML。相反,更喜歡partials views

module ServicesHelper 
    def display_services(user) 
    render :partial => "shared/display_services", :locals => {:user => user} 
    end 
end 
+0

我同意這種方法 - 看起來更清潔,儘可能在幫助程序中儘可能少地構建html。 – cman77

+0

儘管我已經投票贊成了這個答案,但我完全同意在助手中可能會生成最少量的HTML(我敢說,'沒有HTML應該會在幫助者身上產生!'),我想知道關於僅僅一行代碼的這種額外級別的間接性的好處。當然,這會增加在以後的日期或不同的開發人員理解和導航代碼庫所花費的時間。 (雖然我當然可以看到,如果它被使用了很多,它會在短期內節省擊鍵次數。) –