2015-12-12 6 views
0

У меня возникли проблемы с отображением конкретных записей базы данных на странице. У меня есть модель курса со столбцом: класс как целое число, и я создал несколько курсов с разными значениями оценки, и я настроил контроллер классов с действиями, представляющими каждый класс (от 1 до 12), поэтому я могу отображать курсы на отдельных страницах в зависимости от его стоимости, которая была указана в форме при создании нового курса. Это, как им пытается достичь этого в контроллере сортов:Ошибка отображения конкретных записей базы данных с помощью find_by (rails)

class GradesController < ApplicationController 
    def grade1 
    @courses = Course.find_by grade: '1' 
    end 

    def grade2 
    @courses = Course.find_by grade: '2' 
    end 

    . 
    . 
    . 

end 

Проблема в том, что, когда я иду на странице им, что конкретный Grade получаю следующее сообщение об ошибке:

NoMethodError in Grades#grade8 undefined method `each' for nil:NilClass

Что я делаю неправильно в точку? Как я могу отображать только те курсы, которые имеют определенное значение на странице?

+2

'find_by' только собирается возвращать 1 результат. В вашем случае вам нужно будет использовать 'where'. Поскольку он уже находится в контроллере класса, вы можете отобразить список курсов для оценки в классах # show, если у вас установлена ​​связь. Кроме того, покажите нам действие класса 8, в котором происходит ошибка. – lusketeer

ответ

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 вернуть более одного результата. Согласно docs:

Finds the first record

Что вам нужно .where:

@courses = Course.where grade: "1" 

-

Вторая вещь, которую вы должны понять, что Руби object orientated.

Это важно, потому что вы вызываете действия, которые являются супер конкретны:

def grade1 

Это ОЧЕНЬ плохая практика - это сокращает любую расширяемость и делает это так, что ваше приложение может только работать в установленном порядке.

Обойти это использовать объектно-ориентированный RESTful методы, встроенные в Rails, а именно show или index:

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

Спасибо за подробный ответ, и особенно за указание, что то, что я делал, было плохой практикой. –

-1

Вы уверены, что .. find call вернет вам весь набор данных.? Я думаю, вы должны попробовать .... Куда вы можете получить более подробную информацию в рельсах документации ... rails active record query doc

+0

это ответ? –

+0

совершенно так ... для человека ... кто хочет узнать больше от человека, который мало знает, но хочет помочь ... и в то же время еще больше пойдет по пути, чтобы помочь с более подробным ответом. –

Смежные вопросы