2016-12-24 1 views
0

J'utilise Rails '~> 5.0.0', '>= 5.0.0.1' et j'ai différents modèles Organisateur et. Parrain géré par Devise 4.2.Rediriger vers une page spécifique si un modèle (de divers) n'est pas authentifié avec Devise

Ce que je veux est: Si l'utilisateur n'est pas authentifié, rediriger vers une vue spécifique afin qu'ils puissent cliquer sur leur type de profil et ainsi rediriger vers le formulaire de connexion correspondant.

Actuellement, j'utilise la fonctionnalité devise_group pour gérer les deux modèles en tant que génériques en cas de besoin.

Mes fichiers sont comme ça:

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 

Tout semblait fonctionner très bien mais quand j'accéder à une méthode BrochuresController J'ai toujours été redirigé vers le formulaire de connexion des organisateurs ce qui est méchant parce que le sponsor pourrait être confus.

  • First Solution

J'ai trouvé une méthode pour rediriger vers une page neutre où l'utilisateur peut choisir son profil alors j'ai ajouté à la ApplicationController.

def authenticate_member! 
    if member_signed_in? 
     super 
    else 
     redirect_to root_path, notice: "Select your profile to login!" 
    end 
end 

Et cela fonctionne très bien lors de la connexion avec Organizer.

  • New error

Lorsque je me connecte avec le commanditaire, je suis cette erreur:

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 

Dans la console:

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

Je ne sais pas ce que super fait référence à mais parce que c'était le problème que je viens de changer la méthode authenticate_member! je n ApplicationController de cette façon:

def authenticate_member! 
    if !member_signed_in? 
     redirect_to root_path, notice: "Select your profile to login!" 
    end 
end 

Maintenant, tout fonctionne bien (ou semblait).

J'ai aussi la méthode after_sign_in_path_for que j'ai trouvé googling et il semble bien fonctionner.

  • What I want to know is:
  1. que mes solutions (authenticate_member et after_sign_in_path_for) sont de la bonne manière?
  2. Existe-t-il une autre meilleure façon de résoudre ce problème?
  3. Comment puis-je activer/désactiver les autorisations pour les utilisateurs dans les actions du contrôleur? - Certains seulement pour le Sponsor, certains seulement pour l'Organisateur et d'autres pour les deux modèles.

BTW: Je ne pouvais pas trouver assez d'informations et de documentation sur devise_group, donc si quelqu'un a une meilleure expérience en utilisant cette fonction, je voudrais vous faire partager tout type de documents à ce sujet.

Répondre

0

Vos contrôleurs sont tous hérités de ApplicationController, vous pouvez donc facilement définir authenticate_member! pour chaque contrôleur. Exemple:

# 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