如何在routes.rb中定义经过身份验证的帮助程序以调用或访问应用程序控制器current_user方法

时间:2017-12-07 09:55:16

标签: ruby-on-rails

我想为应用程序定义经过身份验证的root。我正在使用omniauth-identity gem进行身份验证,并在应用程序控制器中定义current_user帮助程序。

def current_user
  @current_user ||= User.find_by_id(session[:user_id]) if session[:user_id]
end
helper_method :current_user

def current_user=(user)
 session[:user_id] = user.id
end

在routes.rb中 我希望root基于条件

 root to: 'map#index', constraints: Constraints
 root to: 'pages#about'

在Constraints.rb模块中定义匹配?方法

module Constraints
 def self.matches?(request)
   user = current_user(request)
   return true if user.present?
   false
 end
 def current_user(request)
   @current_user ||= User.find_by_id(request.session[:user_id]) if request.session[:user_id]
 end
end

它工作正常,但问题重复方法current_user或我们需要检查会话两次。

在路由中,我们需要传递请求对象并在本地可用。所以我们如何调用或传递带有请求对象的控制器current_user方法。任何建议,以便我们可以在一个地方定义并访问它。

这类似于设计宝石 经过身份验证和未经身份验证的路由助手。

1 个答案:

答案 0 :(得分:0)

不要在路由中添加条件,只需将其指向应用程序控制器方法,然后使用redirect_to进行相应的重定向。

class ApplicationController
  def index
    if current_user
      redirect_to "maps_path"
    else
      redirect_to "pages_path"
  end

  def current_user
    # your logic
  end
end
  

在routes.rb

root to: /

希望这能解决您的问题