2010-10-29 51 views
1

對不起,我不知道如何標題這個問題。Rails - 加入每個

這裏是我的代碼在視圖:

<% country.cities.each_with_index do |city, i| %> 
    <% city.shops.each do |shop| %> 
    <%=h shop.name.join(", ") %> 
    <% end %> 
<% end %> 

因此,在這個城市裏,讓我們說有三個店:沃爾瑪,Ace五金,哈曼卡頓。

上面代碼的結果將產生:

Walmart Ace Hardware Harman Kardon 

如何加入與他們每個人的「」?我試過<%= shop.name.join(", ") %>,但不允許。錯誤。

謝謝。我喜歡Stack Overflow社區。你們已經更多了,遠勝於真棒!

編輯

我只是發現了一些。沃爾瑪在A市; Ace HArdware和Harman Kardon在B市。這就是爲什麼它按城市來加入城市。

回答

8

代碼:

<%= shop.name.join(", ") %> 

就不行,因爲你已經是塊內,並加入特定於可枚舉,其中在這一點上,你只是有任何對象的方法。

你想要的這裏居然是:

<%= city.spots.map { |shop| shop.name }.join(", ") %> 

這部作品的原因是因爲:

city.spots.map { |shop| shop.name } 

會給你所有的商店,名稱的數組,你可以再加入使用您選擇的字符串。

您可能還需要確保你的HTML逃脫的名字(以防萬一):

<%= h(city.spots.map { |shop| shop.name }.join(", ")) %> 

編輯:

由於injekt指出,和完整的目的,你也可以濫用符號#to_proc及用途:

<%= city.spots.map(&:name).join(", ") %> 

編輯PART2:

現在我們有新的周邊塊,我們需要重新編寫表達式:

<%= h(country.cities.map { |city| city.shops }.flatten.map { |shop| shop.name }.join(", ")) %> 
+1

當然,如果您使用的是Ruby 1.9,則可以使用'Symbol#to_proc'語法,如下所示:'city.spots.map(&:name).join(',')'。另外在Rails 3中,你不需要使用'h'來轉義HTML,因爲這在默認情況下在Erubis – 2010-10-29 16:41:12

+0

中完成。實際上,Symbol#to_proc是ruby 1.8.6/7中rails <3的主動支持的一部分,所以它是可用的。主要的問題是我不想用句法欺騙來混淆答案;但爲了完整性,我會添加示例。 – TreyE 2010-10-29 16:43:41

+0

啊我不知道ActiveSupport支持這個。有趣的,不,我同意我也不會用它作爲正式答案。 – 2010-10-29 16:46:44

-1

試試這個吧!

<% c = [] %> 
<% city.spots.each do |shop| %> 
    <% c << shop.name %> 
    <%= shop.name %> 
<% end %> 
0

而是遍歷你需要的元素結合在一起

<% city.spots.join(', ') %> 

應工作假設city.spots是一個數組的名字,否則,你需要.MAP作爲TreyE使用。