7

我对红宝石很陌生。我有一个疑问,如何从视图中调用控制器方法。

我的控制器

def course_user_count
 @courses=Course.all
 @courses.each do |course|
 @count=course.students.count
end

我必须从我的视图 course.view.html.erb 的方法中调用这个 @count 变量

4

4 回答 4

39

在控制器的顶部,您可以将希望视图可用的方法标记为辅助方法:

helper_method :course_user_count

然后在您看来,您可以调用 course_user_count 并存储结果。

<% count = course_user_count %>
于 2013-09-06T13:58:19.257 回答
9

@count当您说必须从您的视图中“调用此变量”时,我不太明白您的意思。您没有在控制器中设置该变量吗?如果是这样,它应该可以在关联视图中自动访问。(您不会“调用”变量,而是读取或设置它。)

其次,您的方法读取每门课程的学生人数,然后将其分配给变量@count。每次写入此变量时,都会覆盖其先前的值,因此所写的方法是无用的。我不确定您要在这里做什么-也许通过为每门课程预先设置此值来“初始化”控制器?

按照惯例,控制器的show方法显示相关数据库的一行信息。如果目的是在该视图中显示课程的学生人数,我会在以下位置写下这样的内容app/controllers/course_controller.rb

class CourseController < ApplicationController

  def show
    @course = Course.find(params[:id]) # Here I assume that the url is .../courses/<id>
    @student_count = @course.students.count
  end

  ...

end

并在模板中像这样显示变量的值app/views/courses/show.html.erb

<%= @student_count %>

换句话说,我不会在控制器中编写方法来返回课程的学生人数,而是将其作为参数传递给视图,就像我传递视图需要显示的任何其他内容一样——或者至少视图无法通过非常简单的操作访问的任何内容,条件并没有真正满足@course.students.count,但这是一个品味问题。

show但是,在控制器中为计算更复杂和/或每次显示模板时不需要的值定义一个方法可能是有意义的。要使该方法可以从您的视图中调用,必须将该方法声明为辅助方法,正如 Keith 在他的回答中提到的那样。例如,返回所有课程学生总数的方法app/controllers/course_controller.rb

class CourseController < ApplicationController

  helper_method :total_student_count

  def total_student_count
    total_count = 0
    Course.all.each do |c|
      total_count += c.students.count
    end
    total_count
  end

  ...

end

在下面的任何模板中使用这样的方法app/views/courses/来显示该方法返回的值:

<%= total_student_count %>
于 2013-09-06T14:56:38.180 回答
1

将方法名称声明为辅助方法

在视图中调用方法为

<% count = course_user_count %>
于 2015-07-13T10:38:39.183 回答
0

您的控制器可以通过变量在您的视图中访问:

@controller

默认情况下可用。我说的当然是与该特定视图关联的控制器。

在你的情况下:

@controller.course_user_count
于 2013-09-06T13:55:22.900 回答