我想为应用程序定义经过身份验证的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方法。任何建议,以便我们可以在一个地方定义并访问它。
这类似于设计宝石 经过身份验证和未经身份验证的路由助手。
答案 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: /
希望这能解决您的问题