我在页面中显示特定数据库记录时遇到问题。我有一个课程模型,其中:grade列作为整数,我创建了几个具有不同:等级值的课程,我设置了一个Grades控制器,其中的动作代表每个等级(从1到12),所以我可以显示课程在单独的页面上,取决于在创建新课程时在表单中指定的成绩值。这就是我想在Grades Controller中实现这个目标的方法:
class GradesController < ApplicationController
def grade1
@courses = Course.find_by grade: '1'
end
def grade2
@courses = Course.find_by grade: '2'
end
.
.
.
end
问题是,当我转到特定成绩页面时,我会收到以下错误:
等级中的NoMethodError#grade8 undefined方法`each'为 零:NilClass
我到底做错了什么?如何才能在页面上显示具有特定值的课程?
答案 0 :(得分:2)
这样做:
#config/routes.rb
resources :grades, only: [] do
resources :courses, only: [:index], path: "" #-> url.com/grades/:grade_id/courses
end
#app/controllers/courses_controller.rb
class CoursesController < ApplicationController
def index
@courses = Course.where grade: params[:grade_id]
end
end
这样,您就可以调用以下内容(url.com/grades/5
):
#app/views/courses/index.html.erb
<% @courses.each do |course| %>
<%= course.title %>
<% end %>
您遇到的主要问题是您希望find_by
返回多个结果。根据{{3}}:
查找第一个记录
您需要的是docs:
@courses = Course.where grade: "1"
-
您需要了解的第二件事是Ruby是.where
。
这很重要,因为您正在调用超级特定的操作:
def grade1
这是非常不良做法 - 它会削减任何可扩展性并使其成为您的应用程序仅以规定的方式工作。
解决这个问题的方法是使用Rails中内置的面向对象的Restful方法,即show
或index
:
def show
@courses = Course.where grade: params[:grade_id]
end
答案 1 :(得分:-1)
你确定... find call会返回整个数据集。我想你应该尝试一下......你可以在rails文档中获得更多信息...... rails active record query doc