Rails 5.2
У меня две модели девайсов User, Worker
Пользователь и работник имеют свои собственные отдельные представления, сгенерированные устройством.
Я настроил свой контроллер приложений с помощью after_sign_in_path_for(resource)
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
# redirect after sign-in
def after_sign_in_path_for(resource)
case resource
when User
resource.update_attribute(:active, true)
dashboard_path(current_user.id)
when Worker
faq_path
end
end
def after_sign_out_path_for(resource)
# request.referer
root_path
end
end
Однако независимо от конфигурации пользователь перенаправляется на root_path при входе.
Есть ли что-то, чего мне не хватает?
В ваших маршрутах вы можете сделать что-то вроде этого
devise_for :users, controllers: {
sessions: 'users/sessions',
}
devise_for :workers, controllers: {
sessions: 'workers/sessions',
registrations: 'workers/registrations'
}
Затем вы можете создать соответствующие файлы в /app/controllers/users/sessions_controller.rb — /app/controllers/workers/sessions_controllers.rb и т. д. в зависимости от того, что вы описали в файле route.rb.
И затем в этом файле вы можете реализовать свои собственные методы следующим образом:
class Users::SessionsController < Devise::SessionsController
# before_action :configure_sign_in_params, only: [:create]
# GET /resource/sign_in
# def new
# super
# end
# POST /resource/sign_in
# def create
# super
# end
# DELETE /resource/sign_out
# def destroy
# super
# end
def after_sign_in_path_for(resource)
super(resource)
users_root_path # or whatever path you want here
end
# protected
# If you have extra params to permit, append them to the sanitizer.
# def configure_sign_in_params
# devise_parameter_sanitizer.permit(:sign_in, keys: [:attribute])
# end
end
И это более чистое решение для каждого ресурса вместо сравнения класса, и у вас есть свобода настраивать/переопределять любой метод для конкретного ресурса, не усложняя свой код.
Надеюсь, это поможет.
Может ресурс.is_a? Вместо простого звонка? Я думаю, что последний возвращает объект пользователя, поэтому он не равен User.