将控制器方法的结果渲染到视图中的部分

时间:2011-03-15 21:06:39

标签: ruby-on-rails

我在控制器中的方法中有这个Rails代码。它需要四个参数,做一些数学运算,我希望它将存储在'attendance'变量中的值返回到视图中的partial。

def find_attendance(lesson_id, student_id, start_date, end_date)
    marks = Array.new

    all_registers = Register.where(:lesson_id => lesson_id)

    start_date.upto(end_date) do |date|
        all_registers.each do |register|
            if date == register.date
                this_mark = RegisterMark.where(:student_id => student_id, :register_id => register.id)
                this_mark.each do |mark|
                    marks << mark.mark
                end
            end
        end
    end

    attendance = ((Float(marks.count("O")) + Float(marks.count("N"))) / Float(marks.count)) * Float(100)
end

我在相关的视图目录中创建了一个_find_attendance.html.erb文件,并尝试使用&lt;%= render:partial =&gt;调用partial。 “find_attendance”%&gt;但我在传递参数和在部分中使用正确的变量名称时遇到了麻烦。

我尝试过在'出勤'上使用实例变量。

任何指针?

2 个答案:

答案 0 :(得分:1)

您需要做的第一件事是将要传递给视图的值(常规视图和部分视图)放入控制器变量中,如下所示:

@attendance = ((Float(marks.count("O")) + Float(marks.count("N"))) / Float(marks.count)) * Float(100)

接下来,您需要重命名除find_attendance之外的部分内容。这是find_attendance操作的视图名称,如果我理解您的问题,您希望该视图(find_attendance.html.erb)在出勤时调用部分。所以,尝试这样的事情:

find_attendance.html.erb:
<%= render :partial => "attendance", :object => @attendance %>

现在,在partial _attendance.html.erb中,您可以引用实例变量出勤。 (Partials假设存在一个与partial相同名称的实例变量;那就是:我们通过render传递的对象。

_attendance.html.erb:
<p>Attenance: <%= attendance %></p>

答案 1 :(得分:0)

您几乎肯定希望将此方法添加为模型的方法。也许在你的情况下是课程模型?

class Lesson < ActiveRecord::Base

  has_many :registers

  def calculate_attendance_for_student(student, start_date, end_date)
    valid_dates = start_date.upto(end_date)   
    registers.each do |register|
    ...
  end
end

然后在您的视图中,您可以访问@lesson模型以获得出席率。

你的循环中有一些需要改进的地方,我提供了一个简单的方法来循环遍历上面的所有Register for a Lesson。您可以为Register.where和RegisterMark.where执行此操作以提高速度