rails 3:如何将数字连接到符号?

时间:2012-09-03 16:54:57

标签: ruby-on-rails ruby string recursion

我希望{1}}通过使用1..5循环中的@comment1更改为@comment2。我有以下代码非常重复。我希望能干掉它。

嗨,我正在使用acts_as_commentable_with_threading。我基本上循环遍历所有评论并检查该评论是否有孩子。如果是这样,请打印孩子,同时检查孩子是否有孩子。所以我计划深入几个级别,因此@ comment1,2,3等......我怎么能干这个?递归一些怎么样?如果没有,我可以深入几级,并以@ comment5为例结束评论缩进。

EDIT!

谢谢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>

2 个答案:

答案 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 %>

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