Не удается выполнить вход для пользовательского ресурса — ошибка NoMethod в devise / SessionsController#create

#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}»

Как выглядит результат ваших рейковых маршрутов?