Je veux exécuter une fonction avant toute action du contrôleur pour vérifier si l'utilisateur est connecté. J'utilise le système pour pouvoir utiliser is_signed_in ?, mais je dois indiquer la condition contraire pour chaque méthode du contrôleur.
Ce que je veux, c'est avoir quelque chose comme ça:
#some_controller.rb
before_action :is_signed_in?
def is_signed_in?
if !user_signed_in?
redirect_to new_user_session_path
else
..proceed to the action intended to call
end
end
Devise est livré avec quelques helpers intégrés utiles.
Dans votre cas, celui qui vous a intéressé est authenticate_user!
. Jetez un coup d'œil à filtres de contrôleur et aides dans la documentation de Devise.
Vous pouvez filtrer vos actions dans votre contrôleur avec cette méthode pour vous assurer que seuls les utilisateurs connectés peuvent traiter une action donnée ou toutes les actions d'un contrôleur. Sinon, si l'utilisateur n'est pas connecté, il est redirigé vers la page de connexion.
before_action :authenticate_user!
before_action :authenticate_user!, only: [:show]
Vous pouvez également créer votre propre méthode d'assistance.
Dans votre users_controller.rb
, créez un filtre before_action
class UsersController < ApplicationController
before_action :logged_in_user
...
end
et dans votre session_helper.rb
module SessionHelper
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
# Confirms a logged-in user.
def logged_in_user
unless logged_in?
flash[:danger] = "Please log in."
redirect_to login_url
end
end
end
Si vous voulez vérifier si l'utilisateur est signé pour chaque action de l'application, vous devez placer le filtre dans le contrôleur d'application. Vous pouvez également le faire pour un contrôleur spécifique.
Vous pouvez utiliser la méthode devise
:
class SomeController < ApplicationController
before_action :authenticate_user!
...
end
Vous pouvez également créer votre propre filtre:
class SomeController < ApplicationController
before_action :my_authentication
...
def my_authentication
if user_signed_in?
# do something ...
else
# do something else ...
end
end
end
Utilisez-vous concevez ? Vous pouvez utiliser le filtre existant:
class SomeController < ApplicationController
before_filter :authenticate_user!
...
end
sinon, créez votre filtre dans le contrôleur d'application et ajoutez-le à vos contrôleurs nécessaires:
class SomeController < ApplicationController
before_filter :my_auth_filter
...
end
Vous pouvez ajouter cette méthode à votre ApplicationController.
def user_is_logged_in
if !session[:current_user]
redirect_to login_path
end
end
Utilisez-le avant d'appeler des actions. Ainsi,
class AdminsController < ApplicationController
before_action :user_is_logged_in
...
end