我对红宝石很新.我有一个疑问,如何从视图中调用控制器方法.
我的控制器
def course_user_count
@courses=Course.all
@courses.each do |course|
@count=course.students.count
end
Run Code Online (Sandbox Code Playgroud)
我必须从我的视图course.view.html.erb中的方法中调用这个@count变量
小智 31
在控制器的顶部,您可以将视图中可用的方法标记为辅助方法:
helper_method :course_user_count
Run Code Online (Sandbox Code Playgroud)
然后在您的视图中,您可以调用course_user_count并存储结果.
<% count = course_user_count %>
Run Code Online (Sandbox Code Playgroud)
当你说你必须@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
Run Code Online (Sandbox Code Playgroud)
并在模板中显示变量的值app/views/courses/show.html.erb:
<%= @student_count %>
Run Code Online (Sandbox Code Playgroud)
换句话说,我不会在控制器中编写一个方法来返回课程的学生数,而只是将其作为参数传递给视图,就像我传递视图需要显示的任何其他内容一样 - 或者至少视图无法通过非常简单的操作访问的任何内容,这种情况并非真正实现@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
Run Code Online (Sandbox Code Playgroud)
在下面的任何模板中使用这样的方法app/views/courses/来显示该方法返回的值:
<%= total_student_count %>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29824 次 |
| 最近记录: |