在RoR中从帮助器渲染html

时间:2014-04-20 14:26:59

标签: ruby-on-rails

我在帮助器中有一个方法,这里是代码:

    def top_menu_output(parent = Category.where(parent_id: nil))
    parent.each do |p|
      content_tag(:li) do
        parent_id = p.id
        if Category.where(parent_id: parent_id).exists?
          link_to(p.title, p.page_name, class: "parent")
          content_tag(:ul, class: "unstyled") do
            subparent = Category.where(parent_id: parent_id)
            content_tag(:li) do
              top_menu_output(subparent)
            end
          end
        elsif
          link_to(p.title, p.page_name)
        end
      end
    end
  end

我在这样的视图中调用该方法

 <%top_menu_output%>

但它什么都没有。我该怎么做才能呈现所有链接和li?s?谢谢你的回答。

P.S。如果我将代码放在视图中,它可以正常工作,但视图显然不适合该方法。

P.P.S。如果我调用这样的方法&lt;%= top_menu_output%&gt;它从我的数据库CATEGORY ID中提取所有内容:1,PARENT_ID:NIL,PAGE_NAME:&#34;&#34;,关键字:&#34;&#34;,说明:&#34;&#34;, SEO_TEXT_LEFT:&#34;&#34;,SEO_TEXT_RIGHT:&#34;&#34;,CREATED_AT:&#34; 2014-04-19 22:08:55&#34;,UPDATED_AT:&#34; 2014- 04-19 22:08:55&#34; ...

2 个答案:

答案 0 :(得分:1)

each的返回值是迭代的集合,因此您生成了一大堆html但随后又返回了其他内容

您可以将其更改为

parent.collect do |p|
  content_tag(:li) do
    ...
  end
end.join

这将收集每次迭代通过块生成的html,将它们连接起来然后返回。正如评论中指出的那样,您还需要使用&lt;%=或者您永远不会看到任何输出

答案 1 :(得分:0)

感谢Frederick,将each更改为collect几乎就是我想要的。但是,还必须使用concat+,因此正确使用的方法是:

def top_menu_output(parent = Category.where(parent_id: nil))
    parent.collect do |p|
      content_tag(:li) do
        parent_id = p.id
        if Category.where(parent_id: parent_id).exists?
          link_to(p.title, p.page_name, class: "parent") +
          content_tag(:ul, class: "unstyled js-menu") do
            subparent = Category.where(parent_id: parent_id)
            top_menu_output(subparent)
          end
        elsif
          concat link_to(p.title, p.page_name)
        end
      end
    end.join.html_safe
  end