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:
- que mes solutions (authenticate_member et after_sign_in_path_for) sont de la bonne manière?
- Existe-t-il une autre meilleure façon de résoudre ce problème?
- 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.