Рельсы, извлекающие код из представления в помощник (недоразумение 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>
элементы будут созданы.