在 Rails 4 中从 Helper 渲染部分

Render partial from Helper in Rails 4

我已经阅读了很多指南,但我不明白为什么我的方法不起作用:

module StudentsHelper
    def get_training_projects
        @training_projects_student = TrainingProject.where(student_id: @student.id)
        @training_projects_student.count
    end

    def get_training_courses
        @training_course_student = TrainingCourse.joins(:courses_students).where(courses_students: { student_id: @student.id })
        @training_course_student.count
    end

    def storico_studente
        n = get_training_courses + get_training_projects
        i_projects = 0
        i_courses = 0
        until i_courses + i_projects < n
            if @training_course_student[i_courses].data_inizio < @training_projects_student[i_projects].data_inizio
                render partial: "training_course", collection:@training_course_student[i_cousers]
                i_courses += 1
            else
            render partial: "training_project", collection: @training_course_student[i_projects]
            i_projects += 1
            end
        end
    end
end

“_training_project.html.erb”和“_training_course.html.erb”文件位于学生文件夹中。

更新:

上面的代码,循环错了,一直进不去。

  def storico_studente
        n_training_courses = get_training_courses
        n_training_projects = get_training_projects
        n = n_training_courses + n_training_projects 
        i_projects = 0
        i_courses = 0
        while i_courses + i_projects < n

            if @training_course_student[i_courses].nil?
                render partial: 'students/training_project', collection: @training_course_student[i_projects]
                i_projects += 1 if i_projects < n_training_projects

            elsif @training_projects_student[i_projects].nil?
                render partial: 'students/training_course', collection: @training_course_student[i_courses]
                i_courses += 1 if i_courses < n_training_courses

            elsif @training_course_student[i_courses].data_inizio < @training_projects_student[i_projects].data_inizio
                render partial: 'students/training_course', collection: @training_course_student[i_courses]
                i_courses += 1 if i_courses < n_training_courses
            else
                render partial: 'students/training_project', collection: @training_course_student[i_projects]
                i_projects += 1 if i_projects < n_training_projects
            end

        end

    end

现在循环工作正常,我可以在日志中看到正确的调用:

  Rendered students/_training_course.html.erb (0.0ms)
  Rendered students/_training_project.html.erb (0.0ms)
  Rendered students/_training_course.html.erb (0.0ms)

文件仅包含(目前)

<div>ptoject</div>

结束

<div>course</div>

这解释了加载时间(0.0ms)

但是还是不行!

我认为你的 until 循环应该是 while 循环。由于 i_projectsi_courses 都初始化为零并且 n 将始终大于或等于零,因此您的循环仅在 n 为零时执行。

更新

问题是您的辅助方法没有返回呈现的部分。正如您的日志所确认的那样,它正在呈现它们,但永远不会返回结果。我确定有更好的方法,但这里有一个解决方案:

def storico_studente
  n_training_courses = get_training_courses
  n_training_projects = get_training_projects
  n = n_training_courses + n_training_projects 
  i_projects = 0
  i_courses = 0

  partials = []

  while i_courses + i_projects < n
    if @training_course_student[i_courses].nil?
      partials << render(partial: 'students/training_project', collection: @training_course_student[i_projects])
      i_projects += 1 if i_projects < n_training_projects
    elsif @training_projects_student[i_projects].nil?
      partials << render(partial: 'students/training_course', collection: @training_course_student[i_courses])
      i_courses += 1 if i_courses < n_training_courses
    elsif @training_course_student[i_courses].data_inizio < @training_projects_student[i_projects].data_inizio
      partials << render(partial: 'students/training_course', collection: @training_course_student[i_courses])
      i_courses += 1 if i_courses < n_training_courses
    else
      partials << render(partial: 'students/training_project', collection: @training_course_student[i_projects])
      i_projects += 1 if i_projects < n_training_projects
    end
  end

  safe_join partials
end