我希望{1}}通过使用1..5循环中的@comment1
更改为@comment2
。我有以下代码非常重复。我希望能干掉它。
嗨,我正在使用acts_as_commentable_with_threading。我基本上循环遍历所有评论并检查该评论是否有孩子。如果是这样,请打印孩子,同时检查孩子是否有孩子。所以我计划深入几个级别,因此@ comment1,2,3等......我怎么能干这个?递归一些怎么样?如果没有,我可以深入几级,并以@ comment5为例结束评论缩进。
谢谢Samiron!
这是更新的帮助函数......
i
def show_comments_with_children(comments)
comments.each do |comment|
yield comment
if comment.children.any?
concat <<-EOF.html_safe
<div class="span7 offset1-1 pcomment">
EOF
show_comments_with_children(comment.children) { |x| yield x } #Dont worry, this will not run another query :)
concat <<-EOF.html_safe
</div>
EOF
end
end
end
...
<div class="span7 offset1-1 pcomment">
<% @comment1 = comment.children%>
<% for comment in @comment1 %>
<%= render "comment_replies", :comment => comment %>
<div class="span7 offset1-1 pcomment">
<% @comment2 = comment.children%>
<% for comment in @comment2 %>
<%= render "comment_replies", :comment => comment %>
<div class="span7 offset1-1 pcomment">
<% @comment3 = comment.children%>
<% for comment in @comment3 %>
<%= render "comment_replies", :comment => comment %>
<% end %>
</div>
答案 0 :(得分:4)
可能您正在寻找instance_variable_set
。
# Following snippet is not TESTED. It is here to just demonstrate "instance_variable_set"
<%(1..5).each do |i| %>
<% instance_variable_set("@comment#{i}", comment.children) %>
<% for comment in instance_variable_get("@comment#{i}") %>
<%= render "comment_replies", :comment => comment %>
<% end %>
<% end %>
但绝对是不是一种值得推荐的方法。您可以在视图中共享控制器代码以及要实现的目标。必须有一些方法使它适当干燥。在你的帖子中,你总是得到comment.children
。真的吗?
您的观看代码将是这样的
#0th level is the top level
<% show_comments_with_children(@comments, 0) do |comment, level|%>
<!-- #Use level to differ the design for different depth-->
<%= render "comment_replies", :comment => comment %>
<%end%>
并在帮助函数中添加此辅助函数show_comments_with_children
。这将是。
def show_comments_with_children(comments, level)
comments.each do |comment|
yield comment, level
if comment.children.any?
show_comments_with_children(comment.children, level+1) {|x, l| yield x, l} #Dont worry, this will not run another query :)
end
end
end
答案 1 :(得分:0)
您定义此代码的庄园相当差,您应该考虑将@comment
定义为数组而不是每个@comment1, @comment2, etc.
的独立变量。
那就是说,你要找的是instance_variable_get()
方法
<(1..5).each do |i| %>
<% instance_variable_set("@comment#{i}", comment.children) %>
<% for comment in instance_variable_get("@comment#{i}") %>
<%= render "comment_replies", :comment => comment %>
<% end %>
<% end %>
这绝对是个好消息,但在这种情况下,我强烈建议您将注释实例变量转换为数组!