命名空间控制器:未定义局部变量或方法“current_user”

3
我正在为我的Rails应用使用Devise和CanCan/Rolify进行身份验证,但我不知道如何将Devise方法传递给命名空间控制器。我的应用有一个标准的“users”模型和控制器,这部分工作得很好。但是,如果具有特定角色(在注册后确定)的帐户使用主登录页面登录,我会将其重定向到命名空间视图和控制器。例如,用户ID为3的人登录并被重定向到0.0.0.0/external/dashboard,我可以在重定向后的dashboard页面上调用Devise的current_user方法,并返回正确的信息。然而,当我设置一个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)

路由

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

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

外部/仪表板视图
<%= user_name_helper(current_user) %>

user_name_helper(生成用户编辑链接)

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_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方法吗?提前致谢。

1个回答

1

好的,我来翻译。这段内容是关于编程的。问题出在我在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 

我不完全确定为什么条件过滤器不能按照我最初的想法工作,如果有人有任何见解并愿意分享,那么我会倾听,谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接