Ruby: вызывать 'join' после блока - PullRequest
2 голосов
/ 20 февраля 2012

Я наблюдаю за RailsCast (# 101), в котором автор использует несколько методов для создания звездной системы рейтинга для блога. В методе star_image s он вызывает join в конце блока. Я думаю, что это превращает массив в строку, но зачем это нужно делать?

View

<%= 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 голосов
/ 20 февраля 2012

Простой ответ: результат должен быть 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"]

Array#to_s равно Array#inspect, так как ruby ​​1.9. Если вам нужно «читаемое», не техническое представление String, вам следует использовать Array#join.

0 голосов
/ 20 февраля 2012

По сути, это объединение из 5 блоков "img".

"star_image" возвращает новую строку, содержащую один блок "img" для одного изображения звезды.Это вызывается для каждого элемента массива (0 ... 5) .map, и при объединении эти одиночные звездные изображения возвращаются в одну длинную строку.

/ edit

Причина, по которой это делаетсяпросто потому, что вспомогательный метод должен вставить эти блоки изображения в представление.Конечно, вы можете сделать это иначе, например, вернуть массив и выполнить генерацию строки в представлении, но это не имеет смысла и не является хорошим стилем.

0 голосов
/ 20 февраля 2012

Метод star_image создает одну строку с одним тегом img. Предполагается, что метод star_images возвращает одну строку с 5 тегами img.

Если автор не вызвал join в star_images, то star_images вернет массив с 5 строками в нем, что может вызвать непредвиденное поведение. В общем, если у вас есть вспомогательная функция, которая генерирует некоторый HTML, она должна возвращать ее в виде строки (не массива). Вызвав join, он объединяет все 5 строк в одну строку, и эта строка возвращается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...