Рельсы, извлекающие код из представления в помощник (недоразумение content_tag?)

Я получил следующий код на мой взгляд:

<ul class="thumbnails">
  <% Photo.find_all_by_id(my_params, limit: 10).each do |p| %>
    <li class="thumbnail">
      <%= image_tag(p.url(:fb)) %>
    </li>
  <% end %>
</ul>

Он отображает неупорядоченный список с миниатюрами. И все работает хорошо - я вижу список с изображениями:

<ul class="thumbnails">
  <li class="thumbnail">
    <img alt="bmw" src="/assets/.../bmw.jpg?1364218949">
  </li>
</ul>

Я хотел бы поместить его в помощник, вот так:

module PhotosHelper
  def photos_thumbs_by_ids(photos_ids)
    content_tag :ul, :class => "thumbnails" do
      Photo.find_all_by_id(photos_ids, limit: 10).each do |p|
        content_tag :li, :class => "thumbnail" do
          image_tag(p.url(:fb))
        end
      end
    end
  end
end

Но когда я использую <%= photos_thumbs_by_ids my_params %> на мой взгляд, он отображает только:

<ul class="thumbnails"></ul>

Что я делаю неправильно?

3 ответа

Решение

Проблема заключается в следующем:

Photo.find_all_by_id(photos_ids, limit: 10).each do |p|
...
end

Он возвращает массив, а не строку. Попробуйте собрать его с помощью "карты" и сделать соединение

module PhotosHelper
  def photos_thumbs_by_ids(photos_ids)
    content_tag :ul, :class => "thumbnails" do
      Photo.find_all_by_id(photos_ids, limit: 10).map { |p|
        content_tag :li, :class => "thumbnail" do
           image_tag(p.url(:fb))
        end
      }.join.html_safe
    end
  end
end

Это потому, что по крайней мере рендеринг выполняется с помощью полезного метода capture. Этот метод помещает в выходной буфер, только если результатом является строка, и не пытайтесь to_s.

Попробуйте как следует;

<%= photos_thumbs_by_ids(photo_ids) %>

def photos_thumbs_by_ids(photos_ids)
    content_tag :ul, :class => "thumbnails" do
      Photo.find_all_by_id(photos_ids, limit: 10).each do |p|
        content_tag :li, :class => "thumbnail" do
          concat(image_tag(p.url(:fb)))
        end
      end
    end
  end

То, что я обнаружил после просмотра вашего кода, вы не передаете photo_ids параметр при вызове вспомогательного метода.

<%= photos_thumbs_by_ids(photo_ids) %>

Как нет идентификаторов для поиска фотографий, так что возвращается ноль элементов, поэтому нет <li> элементы будут созданы.

Другие вопросы по тегам