在rails 5中递归渲染局部视图

时间:2018-07-17 14:07:04

标签: ruby-on-rails-5

我是红宝石的新手,面对呈现嵌套问题的问题。

我要实现的是呈现问题,并检查是否存在子问题,然后也呈现子问题。 嵌套级别没有限制,因此我必须使用递归方法来实现这一点,这就是我想出的。

# view file code
<% @questions.each do |q| %>

    <%= render partial: "shared/question_block", locals: {q: q} %>

    <% if have_children_questions?(q.id) == 'true' %>

            <%= print_children_questions( get_children_ids(q.id) ) %>

    <% end %>

<% end %>

这是我创建的辅助函数

def have_children_questions?(id)
    children = Question.get_children(id)
    if !children.empty?
        'true'
    else
        'false'
    end
end

def get_children_ids(id)
    ids = Question.where(parent: id).pluck(:id)
end

def print_children_questions(ids)
    ids.each do |id|
        q = Question.find(id)
        render partial: "shared/question_block", locals: {q: q}
        if have_children_questions?(id)
            print_children_questions( get_children_ids(id) )
        end
    end
end

print_children_questions方法返回id而不是部分视图,我在做什么错? 有更好的解决方案

预先感谢

1 个答案:

答案 0 :(得分:0)

我会做这样的事情:

belongs_to :question, required: false
has_many :questions, dependent: :destroy

这将从根本问题到孩子问题建立联系

然后将此范围添加到您的Question模型:

scope :root, -> { where question: nil }

因此您可以在控制器中执行此操作:

@root_questions = Question.root

这会让所有不是孩子的问题都成为另一个问题

然后在您看来:

<% @root_questions.each do |root_question| %>
  <%= render "shared/question_block", q: root_question %>

  # then you can also build partials like this
  <%= render root_question.questions %> #or just do this if it's easier to understand

  <% root_question.questions.each do |question| %>
    <%= render "shared/question_block", q: question %>
  <% end %>
<% end %>