Pan*_*agi 6 ruby-on-rails devise
NameError (undefined local variable or method "current_user" for #<APIRouter:0x007ffd54a81f98>):当我尝试在匹配中使用current_user时出错?约束.我希望将某个虚拟用户路由到一组控制器,并将其他用户路由到另一组控制器.但是,当我尝试使用current_user时,我收到一个错误.
我的匹配约束在APIRouter类中定义:
class APIRouter
def matches? request
@use_rm_app = ENV["USE_RM_APP"] == "true" || (current_user && current_user.is_test)
end
end
Run Code Online (Sandbox Code Playgroud)
关于我如何在比赛中使用当前用户的任何想法?Rails指南中定义的约束.
routes.rb文件中的部分:
# Route to the rm_app controller if APIRouter says we should, otherwise use the real backend controllers.
match '/api/v1/*path', :controller => 'api/v1',
:action => 'handle_create_request',
:via => :post, :constraints => APIRouter.new
Run Code Online (Sandbox Code Playgroud)
更新:解决了ksol. 尝试3工作.让用户使用request.env["warden"].user(:user)
解决方案是修改APIRouter
def matches? request
user = request.env["warden"].user(:user)
(user && user.is_test) || ENV["USE_RM_APP"] == "true"
end
Run Code Online (Sandbox Code Playgroud)
kso*_*sol 12
current_user仅适用于您的控制器和视图.有多种方法可以实现您的需求,将其作为参数提供给您的方法更容易.
编辑
如果current_user在路由器中可访问,则可以通过执行将其传递给约束类constraints: APIRouter.new(current_user).然后,您需要APIRouter#initialize在可以使用的实例var中定义和存储current_user matches?.
编辑2
我记得devise允许你在路由器中执行此操作:
authenticated :user do
root :to => "main#dashboard"
end
Run Code Online (Sandbox Code Playgroud)
我不知道如何确保这一点user.is_test.
编辑3
最后一次尝试.request.env["warden"].user(:user)如果一个用户通过身份验证,应该给你一个用户.
在ksol的帖子的基础上,您可以通过将块传递给经过身份验证来确保user.is_test:
authenticated :user, lambda {|u| u.is_test } do
// route stuff here
end
Run Code Online (Sandbox Code Playgroud)
这假设u.is_test返回一个布尔值.
| 归档时间: |
|
| 查看次数: |
3668 次 |
| 最近记录: |