我在帮助器中有一个方法,这里是代码:
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; ...
答案 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