检查用户是否在Rails中的任何操作之前登录

yer*_*syl 10 ruby-on-rails ruby-on-rails-4

我想在任何控制器操作之前执行一些函数来检查用户是否已登录.我正在使用设计以便我可以使用is_signed_in ?,但我必须将if else条件放入控制器中的每个方法.

我想要的是这样的东西:

#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
Run Code Online (Sandbox Code Playgroud)
因此,我希望此方法在任何操作(或一组操作)之前执行,并重定向以登录为false,或者让该操作执行如果为true.

Flo*_*rry 19

Devise附带了一些有用的内置助手.

在你的情况下,你感兴趣的是authenticate_user!.在Devise文档中查看控制器过滤器和帮助程序.

您可以使用此方法过滤控制器中的操作,以确保只有登录用户可以处理控制器中的给定操作或所有操作,否则如果用户未登录,则会重定向到登录页面.

before_action :authenticate_user!

before_action :authenticate_user!, only: [:show]
Run Code Online (Sandbox Code Playgroud)


Arc*_*yes 9

您还可以创建自己的帮助方法.

在你的users_controller.rb,创建一个before_action过滤器

class UsersController < ApplicationController
    before_action :logged_in_user
    ...
end
Run Code Online (Sandbox Code Playgroud)

在你的 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
Run Code Online (Sandbox Code Playgroud)