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

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

我的控制器

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

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

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

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

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

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

并在模板app/views/courses/show.html.erb显示变量的值,如下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 %> 

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

 helper_method :course_user_count 

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

 <% count = course_user_count %> 

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

在视图中调用方法为

 <% count = course_user_count %> 

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

 @controller 

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

在你的情况下:

 @controller.course_user_count