我正在观看一个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
答案 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_s
为Array#inspect
。如果您需要“可读”,非技术性的字符串表示,则应使用Array#join
。
答案 2 :(得分:0)
基本上它是5&#34; img&#34;的串联。块。
&#34; star_image&#34;返回一个新字符串,其中包含一个&#34; img&#34;阻止一个星形图像。这是为每个数组元素(0 ... 5).map和连接调用这些单个星形图像在一个长字符串中返回。
/编辑
这样做的原因很简单,因为辅助方法应将这些图像块插入到视图中。当然你可以这样做,比如返回一个数组并在视图中进行字符串生成,但这不是一个有意义的,也不是一个好的风格。