2012-02-19 20 views
2

我正在觀看RailsCast(#101),其中的作者使用一些方法爲博客製作星級評分系統。在方法star_image s中,他在塊的末尾調用加入。我認爲這將數組轉換爲字符串,但爲什麼需要這樣做?Ruby:在塊之後調用'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 

回答

0

star_image方法產生單個字符串與單le img標籤在裏面。 star_images方法應該返回一個帶有5個img標籤的字符串。

如果作者沒有在star_images中調用加入,那麼star_images會返回一個包含5個字符串的數組,並且這可能會導致意外的行爲。一般來說,如果你有一個幫助函數產生一些HTML,它應該將它作爲一個字符串(而不是數組)返回。通過調用join,他將所有5個字符串連接成一個字符串,這就是返回的字符串。

0

簡單的回答:結果應該是字符串,而不是數組。

背後的原因可能是紅寶石1.8的變化爲1.9。

拿這個代碼示例:

puts ['a', 'b'] 
puts ['a', 'b'].to_s 
puts "#{['a', 'b']}" 

使用Ruby 1.8你:

a 
b 
ab 
ab 

(我希望我是正確的我有沒有可用的紅寶石1.8版本)。

使用Ruby 1.9你:

a 
b 
["a", "b"] 
["a", "b"] 

Array#to_s是因爲紅寶石1.9 Array#inspect。如果你需要一個'可讀的',非技術性的字符串表示,你應該使用Array#join

0

基本上它是5個「img」塊的拼接。

「star_image」返回一個新字符串,其中包含一個「img」塊用於一個星形圖像。這被稱爲每個數組元素(0 ... 5).map,並加入這些單一的星形圖像返回一個長的字符串。

/編輯

爲什麼這樣做很簡單,因爲輔助方法應插入這些圖像塊的觀點的原因。當然,你也可以這樣做,比如返回一個數組並且在視圖中生成字符串,但這樣做沒有意義,也不是一個好的樣式。

相關問題