2011-09-15 28 views
0

我有一個陣列@cities = ["Vienna", "Barcelona", "Paris"];紅寶石,更好的方式來實現比這個條件迭代?

我試圖用隔離物顯示各個項目之間。然而可能的是,僅存在1陣列,在這種情況下,我不想顯示間隔中的元素。數組也可以是空的,在這種情況下,我不想顯示任何東西。

對於上述陣列我想下面的輸出:

Vienna 
----- 
Barcelona 
----- 
Paris 

我用ERB模板cityview實際打印城市名之前應用格式,CSS等。簡化的,它看起來像這樣:

<p><%= @cities[@city_id] %></p> 

我已經如下實現了它......

unless @array.empty? 
    @city_id = 0; 

    erb :cityview 
end 

unless @array[1..-1].nil? 
    @array[1..-1].each_index do |i| 
     @city_id = i+1; 

     puts "<p>-------</p>"; 

     erb :cityview 
    end 
end 

有沒有更好的辦法?

+0

這是一個Ruby或Ruby on Rails的問題嗎? –

回答

0

我寧願:

ERB:

<p><%= @city %></p> 

和循環

@array.each_with_index do |e, i| 
    @city = e 
    erb :cityview 
    puts "<p>-------</p>" if i < @array.length - 1 
end 

我假設,因爲你要自定義它,你有分裂僱員再培訓局,位。

6
@cities.join("<p>--------</p>") 

編輯處理模板

在這裏,我假設有一個erbs方法返回渲染模板而不做一個看跌期權。返回字符串可以更輕鬆地進行操作和重用。

@cities.map { |c| @city = c; erb :cityview }.join("<p>--------</p>") 
+3

我覺得我有似曾相識,因爲在兩個小時之前,我寫[這](http://StackOverflow.Com/questions/7420214/comma-separation-in-a-ruby-loop/7420250#評論 - 8973446)另一個類似的問題:「這成爲了Ruby的一般規則和幾乎任何其他現代語言:如果你寫一個循環,很可能,你做錯了,有一些高階方法,更高級別的迭代器,組合器,幫助器或類似的東西,你應該用它來代替。「 –

+0

如果'@ cities'包含一些非HTML安全的東西,例如&符號,就會出現問題。 –

+0

@mu看起來像是一個很容易解決的問題。 –

0

如果你想與你的城市名稱來混合HTML,那麼你就不用擔心HTML編碼的東西,你在你的HTML混合之前。只需使用標準庫:

require 'cgi' 
html = @cities.map { |c| CGI.escapeHTML(c) }.join('<p>-----</p>') 

如果你在Rails的是,那麼你可以使用從ERB::Utilhtml_escapehtml_safe標記結果作爲安全換HTML,以避免不必擔心編碼在您的視圖:

include ERB::Util 
html = @cities.map { |c| html_escape(c) }.join('<p>-----</p>').html_safe