Ruby:在块之后调用'join'

时间:2012-02-19 21:26:15

标签: ruby-on-rails ruby

我正在观看一个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

3 个答案:

答案 0 :(得分:0)

star_image方法生成一个单独的字符串,其中包含一个img标记。 star_images方法应该返回一个包含5个img标记的字符串。

如果作者没有在star_images中调用join,那么star_images将返回一个包含5个字符串的数组,这可能会导致意外行为。通常,如果您有一个生成一些HTML的辅助函数,它应该将它作为字符串(而不是数组)返回。通过调用join,他将所有5个字符串连接成一个字符串,这就是返回的字符串。

答案 1 :(得分:0)

简单回答:结果应该是String,而不是数组。

背后的原因可能是将红宝石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"]
ruby 1.9以来,

Array#to_sArray#inspect。如果您需要“可读”,非技术性的字符串表示,则应使用Array#join

答案 2 :(得分:0)

基本上它是5&#34; img&#34;的串联。块。

&#34; star_image&#34;返回一个新字符串,其中包含一个&#34; img&#34;阻止一个星形图像。这是为每个数组元素(0 ... 5).map和连接调用这些单个星形图像在一个长字符串中返回。

/编辑

这样做的原因很简单,因为辅助方法应将这些图像块插入到视图中。当然你可以这样做,比如返回一个数组并在视图中进行字符串生成,但这不是一个有意义的,也不是一个好的风格。