[英]Ruby: calling 'join' after a block
我正在觀看RailsCast(#101),作者使用其中的一些方法為博客建立了星級評分系統。 在star_image
的方法中,他在塊的末尾調用join。 我認為這會將數組轉換為字符串,但是為什么需要這樣做呢?
視圖
<%= render_stars(product.rating) %>
Application_helper.rb
def render_stars
content_tag :div, star_images, :class => 'stars'
end
私人的
def star_images
(0...5).map do |position|
star_image(((@rating-position)*2).round)
end.join
end
def star_image(value)
image_tag "/images/#{star_type(value)}_star.gif", :size => '15x15'
end
def star_type(value)
if value <= 0
'empty'
elsif value == 1
'half'
else
'full'
end
end
star_image
方法產生一個帶有單個img標簽的單個字符串。 應該使用star_images
方法返回其中包含5個img標簽的單個字符串。
如果作者未在star_images
調用join,則star_images
將返回其中包含5個字符串的數組,這可能會導致意外行為。 通常,如果您有一個生成一些HTML的輔助函數,則該輔助函數應將其作為字符串(而不是數組)返回。 通過調用join
,他將所有5個字符串連接在一起成為一個字符串,這就是要返回的字符串。
簡單的答案:結果應該是String,而不是數組。
背后的原因可能是將紅寶石1.8更改為1.9。
請看以下代碼示例:
puts ['a', 'b']
puts ['a', 'b'].to_s
puts "#{['a', 'b']}"
使用ruby 1.8,您將獲得:
a
b
ab
ab
(我希望我是正確的。我沒有可用的ruby 1.8版本)。
使用ruby 1.9,您將獲得:
a
b
["a", "b"]
["a", "b"]
從ruby 1.9開始, Array#to_s
是Array#inspect
。 如果需要“可讀的”,非技術性的字符串表示形式,則應使用Array#join
。
基本上,它是5個“ img”塊的串聯。
“ star_image”返回一個新字符串,其中包含一個星型圖像的一個“ img”塊。 對於每個數組元素(0 ... 5).map調用此方法,並與這些單星圖像一起加入,以長字符串形式返回。
/編輯
這樣做的原因僅僅是因為helper方法會將這些圖像塊插入視圖中。 當然,您也可以執行其他操作,例如返回數組並在視圖中生成字符串,但這沒有任何意義,也不是一種好的樣式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.