从视图Ruby on rails调用控制器方法

时间:2013-09-06 13:49:45

标签: ruby-on-rails

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

我的控制器

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

我必须从我的视图course.view.html.erb

中的方法中调用此@count变量

4 个答案:

答案 0 :(得分:31)

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

helper_method :course_user_count

然后在您的视图中,您可以调用course_user_count并存储结果。

<% count = course_user_count %>

答案 1 :(得分: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 %>

答案 2 :(得分:1)

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

在视图中 将方法称为

<% count = course_user_count %>

答案 3 :(得分:0)

您可以通过变量访问您的控制器:

@controller

默认情况下可用。我当然是在谈论与特定视图相关的控制器。

在你的情况下:

@controller.course_user_count