命名空间控制器的未定义局部变量或方法 'current_user'

Undefined local variable or method 'current_user' for Namespaced Controller

我正在使用 DeviseCanCan/Rolify 对我的 rails 应用程序进行身份验证,并且我'我很难理解如何将 Devise 方法传递给命名空间控制器。

我正在为我的应用程序的主要部分使用标准 users 模型和控制器,这方面的一切都运行良好。但是,我已经设置,如果具有特定 role 的帐户(在注册后确定)使用主登录页面登录,它将把它们重定向到命名空间视图和控制器。

假设 user_id: 3 登录并重定向到 0.0.0.0/external/dashboard,我可以在重定向后在 dashboard 页面上调用 Devise 的 current_user 方法 returns 正确的信息。但是,当我为该用户设置 link_to 以便能够在 0.0.0.0/external/users/3/edit 编辑他的个人资料时,我收到以下错误:

Started GET "/external/users/3/edit" for 127.0.0.1 at 2017-08-31 21:40:59 -0400

ActionController::RoutingError (undefined local variable or method `current_user' for External::UsersController:Class)

routes

devise_for :users, controllers: { confirmations: 'confirmations', registrations: 'registrations' }

# External routes
namespace :external do
  resources :properties, :clients, :orders, :deeds, :mortgages, :users, :owners, :dashboard
end

external/dashboard view

<%= user_name_helper(current_user) %>

user_name_helper(生成用户编辑 link)

def user_name_helper(user)
  if user.name.blank?
    link_to "Update your profile here.", edit_external_user_path(user)
  else
    "Hello, #{user.name}"
  end
end

点击这个助手生成的link时出错

但是 <%= link_to fa_icon("sign-out", text: "Logout"), destroy_user_session_path, method: :delete %>0.0.0.0/external/dashboard 开始工作正常。

所以我很困惑为什么我可以在 External::DashboardController 的视图中调用 current_user 但不能在 External::UsersController 中调用它。所有命名空间控制器都直接继承自 ApplicationController,我想继续只使用一个 users model。我搜索了很多不同的文章,但似乎找不到与我的配置类似的答案,所以任何人都可以向我解释我可能做错了什么以及如何让它工作以及允许我能够在我的命名空间视图中使用任何其他 Devise methods?提前致谢。

好吧,我明白了。问题是我在 external/ 控制器中调用条件 before_filter,如下所示:

before_filter :client_only unless current_user.has_role? :admin

删除后一切都按预期进行。我仍然有以下 before_filter 可以正常工作。

before_filter :client_only

...

private

def client_only
  redirect_to root_path unless current_user.is_client?
end 

不完全确定为什么条件过滤器不能按照我最初的方式工作,所以如果有人有任何见解并想分享,那么我洗耳恭听,谢谢。