1

我想通过在 1..5 循环中使用@comment1来更改。我有以下非常重复的代码。我希望把它晒干。@comment2i

嗨,我正在使用acts_as_commentable_with_threading。我基本上循环浏览所有评论并检查该评论是否有孩子。如果是这样,打印出孩子,同时检查这些孩子是否有孩子。所以我计划深入几个层次,因此@comment1、2、3 等......我怎样才能干燥这个?递归一些如何?如果没有,我可能会更深入一些级别,例如在@comment5 处结束评论缩进。

编辑!

谢谢你萨米伦!

这是更新的辅助函数...

    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>

……

<%(1..5).each do |i| %>
  <% @comment1 = comment.children%>
  <% for comment in @comment1 %>
    <%= render "comment_replies", :comment => comment %>
  <% end %>
<% end %>
4

2 回答 2

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
于 2012-09-03T17:24:41.583 回答
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 %>

这绝对是一件好事,但在这种情况下,我强烈建议您将注释实例变量转换为数组!

于 2012-09-03T17:29:00.217 回答