使用find_by(rails)显示特定数据库记录时出错

时间:2015-12-12 11:53:49

标签: ruby-on-rails filter

我在页面中显示特定数据库记录时遇到问题。我有一个课程模型,其中: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

我到底做错了什么?如何才能在页面上显示具有特定值的课程?

2 个答案:

答案 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方法,即showindex

def show
    @courses = Course.where grade: params[:grade_id]
end

答案 1 :(得分:-1)

你确定... find call会返回整个数据集。我想你应该尝试一下......你可以在rails文档中获得更多信息...... rails active record query doc