2010-06-23 39 views
22

我正在使用Ruby on Rails,並且需要在我的一個html.erb文件中運行一段Ruby代碼塊。難道我不喜歡這樣寫道:如何在html.erb文件中運行多行Ruby

<% def name %> 
<% name = username %> 
<%= name %> 

或像這樣:

<% def name 
name = username %> 
<%= name %> 

感謝您的閱讀。

+0

你爲什麼要在視圖中創建一個函數?它屬於最有可能進入模型,或者如果不進入控制器,但絕對不會進入視圖 – jigfox 2010-06-23 08:21:09

+0

對不起,我只是在那裏快速鍵入一些代碼作爲例子。 – ben 2010-06-23 08:39:40

回答

22

在ERB文件中定義方法並不常見,所以我建議不要這樣做。

如果你想調用像#each塊,你可以這樣做以下:

<% names.each do |name| %> 
    <%= name %> 
<% end %> 

不要忘了<% end %>

+2

,你在'| name'之後忘了'|';-) – jigfox 2010-06-23 08:18:45

34

如果您在視圖中需要額外的功能,您通常會在助手中聲明這些功能。

對於每個控制器,如果有助手,它會自動加載。舉例來說,如果你有一個把PeopleController,在app/helpers文件夾中,應該有一個people_helper.rb,它應該是這樣的

module PeopleHelper 
    def name 
    #do something 
    username 
    end 
end 

另外,很乾淨的替代,是使用Presenterpattern,但我認爲它不太常見(不幸)。

否則,如果你確實需要一個ERB視圖中的紅寶石多行代碼,我儘量避免,我寧願以下樣式:

<% 
    counter_1 = 0 
    counter_2 = 1 
    do_some_more_prep_here 
%> 
<% @records.each do |rec|%> 
    <%# do something with the prepped date in each row %> 
<% end %> 

對我來說也代碼縮進比HTML縮進更重要,所以我會喜歡這樣的東西

<table> 
    <% @rows.each do |row| %> 
    <tr> 
     <td><%= row.item1 %></td> 
     <% if row.some_test %> 
     <td><%= row.item2 %></td> 
     <% end %> 
    </tr> 
    <% end %> 
</table> 

但我總是很有興趣聽到在這個問題上的不同意見。

+3

當然,輔助方法是最好的選擇。 – tadman 2010-06-23 14:22:09

-1

我可以想象有人需要它在一個特定的模板(沒有點創建助手)不重複的HTML標記。也就是說,當生成的html頁面有幾個類似的html標記塊時。雖然,它很容易被濫用(不可讀的代碼)。

<% def f1(a, b, c) %> 
    test: <%= a %>, <%= b %>, <%= c %> 
<% end %> 

<% f1(1, 2, 3) %> 
<% f1(4, 5, 6) %> 
+0

這似乎不適用於我https://i.imgur.com/oWOu5v8.png – barlop 2018-02-19 19:08:31

+0

你的答案不起作用,它所做的只是將該功能的內容放在網頁上,將其視爲HTML不是rails或者ruby代碼https://i.imgur.com/rhTNtt5.png – barlop 2018-02-20 14:55:43

+0

@barlop對不起,沒有精心打理。看看我的答案。那對你有用嗎?這可能是我的意思。 – 2018-02-20 17:18:14

相關問題