Я использую Rails '~> 5.0.0', '>= 5.0.0.1'
и у меня разные модели Организатор и. Спонсор Управление: Devise 4.2
.Переадресация на конкретную страницу, если какая-либо модель (из разных) не аутентифицирована с помощью Devise
Что я хочу: Если пользователь не прошел проверку подлинности, перенаправить к определенному мнению, таким образом они могут нажать на их тип профиля и поэтому перенаправлять на соответствующую форму входа в систему.
На самом деле я использую функцию devise_group
, чтобы управлять обеими моделями в качестве общего, когда это необходимо.
Мои файлы так:
application_ontroller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
devise_group :member, contains: [:organizer, :sponsor]
private
def after_sign_in_path_for(resource)
case resource
when Organizer
dashboard_path
when Sponsor
brochures_path
end
end
end
brochures_controller.rb
class BrochuresController < ApplicationController
# Ensure an organizer is logged in before going ahead.
before_action :authenticate_member!
end
Все казалось работать нормально, но когда я получить доступ к любой метод в БрошюрыКонтроллер Я всегда был перенаправлен на форму регистрации организаторов , которая неприятна, потому что спонсор может запутаться.
- First Solution
Я нашел способ перенаправления нейтральной страницы, на которой пользователь может выбрать свой профиль, так что я добавил к ApplicationController
.
def authenticate_member!
if member_signed_in?
super
else
redirect_to root_path, notice: "Select your profile to login!"
end
end
И он отлично работает при входе в систему с Организатором.
- New error
Когда я Войти с Спонсора я получил эту ошибку:
super: no superclass method `authenticate_member!' for #<BrochuresController:0x007fa760e387f8> Did you mean? authenticate_sponsor!
Extracted source (around line #13):
11 def authenticate_member!
12 if member_signed_in?
13 super
14 else
15 redirect_to root_path, notice: "Select your profile to login!"
16 end
В консоли:
NoMethodError (super: no superclass method `authenticate_member!' for #<BrochuresController:0x007fa760e387f8>
Did you mean? authenticate_sponsor!):
app/controllers/application_controller.rb:13:in `authenticate_member!'
Rendering /Users/alex/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout
Rendering /Users/alex/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb
Rendered /Users/alex/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (3.1ms)
Rendering /Users/alex/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb
Rendered /Users/alex/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (1.7ms)
Rendering /Users/alex/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb
Rendered /Users/alex/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (0.9ms)
Rendered /Users/alex/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (143.0ms)
- My Solution
Я не знаю, что super
относится к но потому что это была проблема, я просто изменил метод authenticate_member!
i п ApplicationController таким образом:
def authenticate_member!
if !member_signed_in?
redirect_to root_path, notice: "Select your profile to login!"
end
end
Теперь все работает отлично (или казалось).
У меня также есть after_sign_in_path_for
метод, который я нашел googling и, похоже, работает нормально.
- What I want to know is:
- ли мои решения (authenticate_member и after_sign_in_path_for) в правильном направлении?
- Есть ли еще лучший способ решить эту проблему?
- Как включить или отключить разрешения для пользователей в действиях контроллера? - Некоторые только для Спонсора, некоторые только для Организатора, а некоторые для обеих моделей.
BTW: Я не мог найти достаточно информации и документации о devise_group
, так что если кто-то имеет лучший опыт использования этой функции я хотел бы, чтобы вы поделиться какой-либо документы о нем.