簡體   English   中英

Ruby:在一個塊之后調用“ join”

[英]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_sArray#inspect 如果需要“可讀的”,非技術性的字符串表示形式,則應使用Array#join

基本上,它是5個“ img”塊的串聯。

“ star_image”返回一個新字符串,其中包含一個星型圖像的一個“ img”塊。 對於每個數組元素(0 ... 5).map調用此方法,並與這些單星圖像一起加入,以長字符串形式返回。

/編輯

這樣做的原因僅僅是因為helper方法會將這些圖像塊插入視圖中。 當然,您也可以執行其他操作,例如返回數組並在視圖中生成字符串,但這沒有任何意義,也不是一種好的樣式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM