rails从视图中提取代码到帮助器(content_tag误解?)

时间:2013-03-26 08:33:02

标签: ruby-on-rails ruby-on-rails-3 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 个答案:

答案 0 :(得分:1)

在看到您的代码后我发现,您在调用辅助方法时没有传递photo_ids参数。

<%= photos_thumbs_by_ids(photo_ids) %>

由于没有找到照片的ID,因此它返回零项,因此不会创建<li>个项目。

答案 1 :(得分:1)

尝试如下;

<%= 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

答案 2 :(得分:1)

问题是每个:

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

它返回一个数组,而不是字符串。尝试使用&#39; map&#39;来收集它。并加入

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。