我是红宝石的新手,面对呈现嵌套问题的问题。
我要实现的是呈现问题,并检查是否存在子问题,然后也呈现子问题。 嵌套级别没有限制,因此我必须使用递归方法来实现这一点,这就是我想出的。
# 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而不是部分视图,我在做什么错? 有更好的解决方案
预先感谢
答案 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 %>