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

9

我非常不了解Ruby。我的一个疑问是,如何从视图调用控制器方法。

我的控制器

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

我需要在我的视图course.view.html.erb中从方法中调用@count变量。

4个回答

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

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

helper_method :course_user_count

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

<% count = course_user_count %>

@Keith,一个小更新,它是helper_method :course_user_count - Sri Harsha Kappala
这个答案对我在Rails 4.0.0上起作用。非常感谢! - Marty C.
这个答案完全正确,对我很有用。然而,请记住“胖模型,瘦控制器”的格言。大多数情况下,在控制器上放置一个帮助方法并不是正确的做法。请记得查看您在视图中使用的模型,并查看是否有任何一个更好的地方可以放置您想要执行的代码。 - Jason L.

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 %>

1
声明方法名称为帮助方法。
在视图中调用该方法。
<% count = course_user_count %>

0

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

@controller

这是默认提供的。当然,我指的是与该特定视图相关联的控制器。

在您的情况下:

@controller.course_user_count

这不适用于Rails 5(或可能是4但未经测试) - edwardmp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接