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

时间:2017-09-01 02:08:45

标签: ruby-on-rails devise namespaces ruby-on-rails-5 rails-routing

我正在使用设计以及 CanCan / Rolify 来验证我的rails应用,并且我很难理解如何通过Devise命名空间控制器的方法。

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

让我们说user_id: 3登录并重定向到0.0.0.0/external/dashboard,重定向后我可以在current_user页面上调用Devise的dashboard方法并返回正确的信息。但是,当我为该用户设置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 (生成用户编辑链接)

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

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

1 个答案:

答案 0 :(得分:0)

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

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 

不完全确定为什么条件过滤器不会像我原来那样工作,所以如果有人有任何洞察力并且感觉像分享那么我会全力以赴,谢谢。