#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]
isnil
=> вы получили ошибку.
Ответ №1:
Прежде всего, вы не можете пытаться найти по параметрам в консоли, потому что такой вещи нет.
Попробуйте это в консоли:
User.find(2)
(..столбец по умолчанию, в котором метод find ищет значение, является первичным ключом, который, как я полагаю, является идентификатором, как обычно)
Тогда другое дело, если вы уже аутентифицируете пользователя в before_filter, возможно, у вас уже установлен @current_user или что-то в этомроде, используете ли вы какой-нибудь плагин аутентификации, такой как devise или что-то в этомроде? Таким образом, нет необходимости передавать текущий идентификатор пользователя контроллеру панели мониторинга. Контроллер приложения уже знает, кто этот пользователь, и ваш контроллер панели мониторинга является его подклассом.
И убедитесь, что в вашей таблице job_category также есть столбец user_id.
Комментарии:
1. Ты совершенно права, Йока. Я использую Devise, поэтому у меня уже был установлен идентификатор, мне нужно было использовать: @job_categories = current_user.job_categories и это работает!! Огромное спасибо!