рельсы ассоциации has_many

#ruby-on-rails-3 #activerecord #has-many

#ruby-on-rails-3 #activerecord #имеет-many

Вопрос:

У меня есть модель пользователя и модель Job_Category, модель Job_Category

 belongs_to :user
  

Пользовательская модель

 has_many :job_categories, :dependent => :destroy   
  

У меня есть контроллер панели мониторинга, и я пытаюсь отобразить все Job_Categories для конкретного вошедшего в систему пользователя.

 class DashboardController < ApplicationController
before_filter :authenticate_user!


def index
 @user = User.find(params[:id])
 @job_categories = @user.job_categories


 #@job_categories = JobCategory.all

 #respond_to do |format|
#   format.html # index.html.erb
#   format.xml  { render :xml => @job_categories }
# end

end
  

Однако, когда я пытаюсь отобразить это, я получаю сообщение об ошибке «Не удалось найти пользователя без идентификатора». Я вижу это в журнале:

Обработка DashboardController#index при загрузке пользователем HTML (0,3 мс) ВЫБЕРИТЕ «пользователи».* ИЗ «users», ГДЕ («users».»id» = 2) ОГРАНИЧЕНИЕ 1 Завершено за 22 мс

ActiveRecord::RecordNotFound (не удалось найти пользователя без идентификатора): app / controllers /dashboard_controller.rb:9: в `индексе’

Комментарии:

1. Можете ли вы попробовать это в консоли rails, есть ли запись с id = 2?

2. Я вижу user.id = 2 в базе данных. Я попробовал это в консоли, и я получаю другую ошибку. >> пользователь = user.find(параметры[:id]) Ошибка имени: неопределенная локальная переменная или параметры метода для main:Объект из (irb): 5 из :0

3. Единственное, о чем я могу подумать, должно ли это быть в пользовательском контроллере вместо контроллера панели мониторинга? Это должно работать в контроллере панели инструментов, верно?

4. Можете ли вы опубликовать свой файл маршрутов? Похоже, что вы не передаете параметр id в действие => params[:id] is nil => вы получили ошибку.

Ответ №1:

Прежде всего, вы не можете пытаться найти по параметрам в консоли, потому что такой вещи нет.

Попробуйте это в консоли:

User.find(2)

(..столбец по умолчанию, в котором метод find ищет значение, является первичным ключом, который, как я полагаю, является идентификатором, как обычно)

Тогда другое дело, если вы уже аутентифицируете пользователя в before_filter, возможно, у вас уже установлен @current_user или что-то в этомроде, используете ли вы какой-нибудь плагин аутентификации, такой как devise или что-то в этомроде? Таким образом, нет необходимости передавать текущий идентификатор пользователя контроллеру панели мониторинга. Контроллер приложения уже знает, кто этот пользователь, и ваш контроллер панели мониторинга является его подклассом.

И убедитесь, что в вашей таблице job_category также есть столбец user_id.

Комментарии:

1. Ты совершенно права, Йока. Я использую Devise, поэтому у меня уже был установлен идентификатор, мне нужно было использовать: @job_categories = current_user.job_categories и это работает!! Огромное спасибо!