2016-12-24 2 views
0

Я использую 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:
  1. ли мои решения (authenticate_member и after_sign_in_path_for) в правильном направлении?
  2. Есть ли еще лучший способ решить эту проблему?
  3. Как включить или отключить разрешения для пользователей в действиях контроллера? - Некоторые только для Спонсора, некоторые только для Организатора, а некоторые для обеих моделей.

BTW: Я не мог найти достаточно информации и документации о devise_group, так что если кто-то имеет лучший опыт использования этой функции я хотел бы, чтобы вы поделиться какой-либо документы о нем.

ответ

0

Все ваши контроллеры унаследованы от ApplicationController, поэтому вы можете легко определить authenticate_member! для каждого контроллера. Пример:

# organizer_controller.rb 
def authenticate_member! 
    if !member_signed_in? 
    redirect_to organizers_path, notice: "Organizer notice" 
    end 
end 

# sponsor_controller.rb 
def authenticate_member! 
    if !member_signed_in? 
    redirect_to sponsor_root_path, notice: "Notice for sponsors" 
    end 
end