неопределенный метод `find' для Admin:Class CanCan

Кто-нибудь видел эту ошибку:

undefined method `find' for Admin:Class

При использовании Devise и CanCan?

Я не могу определить, где это ошибка: журналы не показывают ничего полезного:

Started GET "/admin/become?id=3" for 127.0.0.1 at Wed Apr 06 13:09:15 -0700 2011
  SQL (0.3ms)  SHOW client_min_messages
  SQL (0.2ms)  SET client_min_messages TO 'panic'
  SQL (0.5ms)  SET standard_conforming_strings = on
  SQL (0.2ms)  SET client_min_messages TO 'notice'
  SQL (0.4ms)  SET time zone 'UTC'
  SQL (0.1ms)  SHOW TIME ZONE
  Processing by AdminController#become as HTML
  Parameters: {"id"=>"3"}
  User Load (2.2ms)  SELECT "users".* FROM "users" WHERE ("users"."id" = 2) LIMIT 1
Completed   in 57ms

NoMethodError (undefined method `find' for Admin:Class):


Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.3/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.9ms)
  Permission Load (2.5ms)  SELECT * FROM "permissions" INNER JOIN "groups" ON "groups"."id" = "permissions"."group_id" WHERE ("permissions"."user_id" = 2) ORDER BY groups.name ASC
  SQL (1.3ms)   SELECT COUNT(*)
 FROM pg_tables
 WHERE tablename = 'groups'

Трассировка приложения:

cancan (1.5.1) lib/cancan/controller_resource.rb:102:in `find_resource'
cancan (1.5.1) lib/cancan/controller_resource.rb:67:in `load_resource_instance'
cancan (1.5.1) lib/cancan/controller_resource.rb:31:in `load_resource'
cancan (1.5.1) lib/cancan/controller_resource.rb:24:in `load_and_authorize_resource'
cancan (1.5.1) lib/cancan/controller_resource.rb:9:in `send'
cancan (1.5.1) lib/cancan/controller_resource.rb:9:in `_callback_before_35483'
activesupport (3.0.3) lib/active_support/callbacks.rb:456:in `_run__22524425__process_action__2106917469__callbacks'
activesupport (3.0.3) lib/active_support/callbacks.rb:409:in `send'
activesupport (3.0.3) lib/active_support/callbacks.rb:409:in `_run_process_action_callbacks'
activesupport (3.0.3) lib/active_support/callbacks.rb:93:in `send'
activesupport (3.0.3) lib/active_support/callbacks.rb:93:in `run_callbacks'
actionpack (3.0.3) lib/abstract_controller/callbacks.rb:17:in `process_action'
actionpack (3.0.3) lib/action_controller/metal/instrumentation.rb:30:in `process_action'

person AnApprentice    schedule 06.04.2011    source источник
comment
Вы пытались войти в консоль рельсов и сделать то же самое? Что там на выходе? Кроме того, я предполагаю, что вы выполняете Admin.find(3)?   -  person Christopher WJ Rueber    schedule 07.04.2011
comment
@ Крис, как бы я сделал это в консоли. Я не делаю Admin.find, см. здесь: stackoverflow.com/questions/5572015/   -  person AnApprentice    schedule 07.04.2011
comment
У вас есть тип пользователя Admin? Вы когда-нибудь генерировали один? Или вам доступен только класс User для пользователей?   -  person Christopher WJ Rueber    schedule 07.04.2011
comment
У меня есть таблица USER, а не таблица ADMIN. В пользовательской таблице у меня есть поле администратора, которое является логическим. У меня есть контроллер администратора и модель, но модель пуста. конец класса администратор   -  person AnApprentice    schedule 07.04.2011


Ответы (1)


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

Ваша проблема связана с отсутствием класса администратора на основе Devise. Я почерпнул эту информацию из ошибки NoMethodFound. Это означает, что вы не можете использовать на нем какие-либо методы ActiveRecord, что пытается сделать базовая реализация. Вероятно, вы захотите заменить эту строку кода...

return unless current_user.is_an_admin?

с чем-то вроде этого...

return unless current_user.admin == true

(или что-то, что можно найти в таблице вашей модели пользователя)

person Christopher WJ Rueber    schedule 06.04.2011
comment
Это невероятно вдумчивый ответ. Спасибо! Я бы проголосовал 3 раза, если бы мог. Я попробовал это сделать, но он все равно выдает ошибку с неопределенным методом `find' для Admin:Class и current_user.admin действителен, потому что я использую это в другом месте. если я закомментирую все внутри метода be, все равно будут ошибки, поэтому я думаю, что это что-то с CanCan - person AnApprentice; 07.04.2011
comment
Рад помочь, и.. Хм! Можете ли вы опубликовать содержимое AdminController в своем вопросе? Есть ли у него предварительный фильтр, который пытается сделать что-то вроде authentication_admin! или что-то в этом месте? - person Christopher WJ Rueber; 07.04.2011
comment
До сих пор я изолировал это до этого... Если я прокомментирую это, это сработает, но тогда контроллер администратора открыт для всех: В AdminController: load_and_authorize_resource #CanCan - person AnApprentice; 07.04.2011
comment
Мне интересно, не ожидает ли CanCan какую-то модель администратора (под капотом). У меня нет большого (читай: никакого) опыта работы с CanCan. Вроде авторизуется! метод немного запутанный. Мне интересно, не могли бы вы придумать какой-нибудь ActiveRecord на основе наследования, который можно было бы использовать только для администратора.. Это вообще вариант? Или разделение вашего администратора на другой стол даже для вас? - person Christopher WJ Rueber; 07.04.2011
comment
да, это определенно CanCan, мне нужно как-то авторизовать модель администратора через модель пользователя. Я, вероятно, должен начать вопрос CanCan для этого. - person AnApprentice; 07.04.2011