6

NameError (undefined local variable or method "current_user" for #<APIRouter:0x007ffd54a81f98>):当我尝试在比赛中使用 current_user 时出现错误?约束。我希望某些虚拟用户被路由到一组控制器,而其他用户被路由到另一组控制器。但是,当我尝试使用 current_user 时出现错误。

  • 设计(2.0.4)
  • 导轨 (3.2.2)

我的匹配约束在 APIRouter 类中定义:

class APIRouter
  def matches? request
    @use_rm_app = ENV["USE_RM_APP"] == "true" || (current_user && current_user.is_test)
  end
end

关于如何在比赛中使用当前用户的任何想法?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

更新:感谢 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
4

3 回答 3

15

current_user仅在您的控制器和视图中可用。有不止一种方法可以实现您想要的,更容易将其作为参数提供给您的方法。

编辑

如果current_user如果可以在路由器中访问,则可以通过执行将其传递给您的约束类constraints: APIRouter.new(current_user)。然后,您需要定义APIRouter#initializecurrent_user 并将其存储在一个实例 var 中,您可以在matches?.

编辑 2

我只记得设计允许您在路由器中执行此操作:

authenticated :user do
  root :to => "main#dashboard"
end

我不知道如何确保这一点user.is_test

编辑 3

最后一次尝试。request.env["warden"].user(:user)如果经过身份验证,应该给你一个用户。

于 2012-09-25T18:38:23.873 回答
6

基于 ksol 的帖子,您可以通过将块传递给经过身份验证的来确保 user.is_test:

authenticated :user, lambda {|u| u.is_test } do
    // route stuff here
end

这是假设 u.is_test 返回一个布尔值。

于 2013-10-04T03:37:28.550 回答
0

只要记住添加 diff :as 对于两个 root 否则它将通过错误

authenticated :user do
  root :to => "main#dashboard", :as => :foo
end

root :to => "main#landing_page"
于 2015-06-01T05:35:33.410 回答