Ruby on rails 仅限登录用户访问Rails应用程序

Ruby on rails 仅限登录用户访问Rails应用程序,ruby-on-rails,Ruby On Rails,我正在学习Rails,我试图在用户未登录时限制对页面的访问,并且只允许他们查看登录和注册页面 目前,我的代码在用户登录时创建会话,在用户注销时清除会话。我有一个会话助手,这样我可以检查用户是否已登录,但如果用户未登录,我不确定如何在整个应用程序中重定向该用户 更新: 当我发布这个问题时,我设法找到了一个before_过滤器。我应该使用before\u操作还是before\u过滤器 我是否需要在所有要限制访问的控制器中复制相同的方法 代码: /控制器/应用程序\u controller.rb cl

我正在学习Rails,我试图在用户未登录时限制对页面的访问,并且只允许他们查看登录和注册页面

目前,我的代码在用户登录时创建会话,在用户注销时清除会话。我有一个会话助手,这样我可以检查用户是否已登录,但如果用户未登录,我不确定如何在整个应用程序中重定向该用户

更新:


  • 当我发布这个问题时,我设法找到了一个before_过滤器。我应该使用before\u操作还是before\u过滤器

  • 我是否需要在所有要限制访问的控制器中复制相同的方法

  • 代码:

    /控制器/应用程序\u controller.rb

    class ApplicationController < ActionController::Base
      protect_from_forgery with: :exception
      include SessionsHelper
    end
    
    class SessionsController < ApplicationController
    
      def new
      end
    
      def create
        user = User.find_by(email: params[:session][:email].downcase)
        if user && user.authenticate(params[:session][:password])
          log_in user
          redirect_to user
        else
          flash.now[:danger] = 'Invalid email/password combination'
          render 'new'
        end
      end
    
      def destroy
        log_out
        redirect_to root_url
      end
    
    end
    

    您可以在执行操作之前使用
    。rails指南有一个很好的例子:

    class ApplicationController < ActionController::Base
      before_action :require_login
    
      private
    
      def require_login
        unless logged_in?
          flash[:error] = "You must be logged in to access this section"
          redirect_to new_login_url # halts request cycle
        end
      end
    end
    
    class ApplicationController
    当我发布问题时,我设法找到了一些可以使用before\u过滤器的东西。我应该使用before\u操作还是before\u过滤器?另外,我是否可以避免在我的所有控制器中复制相同的方法?@Bhav-Use-before\u-action,before\u-filter被弃用,并将在Rails 5.1中删除(请参阅此答案:)。我相信,如果您在ApplicationController中定义
    require\u login
    之后才执行操作:require\u login
    ,并且您的所有控制器都继承自它,那么默认情况下它将被启用,因此您无需复制任何内容。您可以使用
    skip\u before\u action
    在适当的情况下将其关闭。@emil.p.stanchev很抱歉,这太旧了,但使用此方法,我将错误
    重定向给您太多次。
    class ApplicationController < ActionController::Base
      before_action :require_login
    
      private
    
      def require_login
        unless logged_in?
          flash[:error] = "You must be logged in to access this section"
          redirect_to new_login_url # halts request cycle
        end
      end
    end