#ruby-on-rails #ruby #devise
#ruby-on-rails #ruby #разработать
Вопрос:
У меня особая проблема с Rails 3 и Devise. У меня есть 3 типа пользователей для моего приложения Rails:
клиенты, владельцы и администраторы
routes.rb:
devise_for :admins
devise_for :owners
devise_for :clients
application_controller.rb:
def after_sign_in_path_for(resource)
if resource == "client"
"/client_accounts/" current_client.id.to_s
elsif resource == "admin"
stored_location_for(:admins) || "/admin/control_panel"
elsif resource == "owner"
stored_location_for(:owners) || "/client_accounts"
end
end
Мой вход для владельцев и администраторов работает нормально, но я не могу заставить работать вход клиентов.. Вот ошибка, которую я получаю:
NoMethodError in Devise/sessionsController#create
undefined method `client_url' for #<Devise::SessionsController:0x10a98f868>
Трассировка приложения пуста.
Ответ №1:
Согласно документам Devise, метод after_sign_in_path_for принимает фактический объект Client, но вы сравниваете входные данные с набором строк, которые все вернут false , поэтому ваше большое предложение if вернет nil. Не уверен, для чего предназначен Devise, когда это произойдет, но поиск ‘client_url’ был бы разумным по умолчанию.
Попробуйте это вместо:
def after_sign_in_path_for(resource)
case resource
when Client then "/client_accounts/" current_client.id.to_s
when Admin then stored_location_for(:admins) || "/admin/control_panel"
when Owner then stored_location_for(:owners) || "/client_accounts"
end
end
Если это не поможет, я бы поместил инструкцию debugger в начало метода, чтобы убедиться, что ваши помощники, такие как ‘current_client’, ведут себя так, как вы ожидаете (и чтобы убедиться, что after_sign_in_path_for вообще вызывается).
Комментарии:
1. Правдивая история, приятель, милая. Как он и сказал ^^
Ответ №2:
Просто мысль, но что произойдет, если вы измените ответ на: «/client_accounts/#{current_client.id.to_s}»
Как выглядит результат ваших рейковых маршрутов?