命名空间控制器的未定义局部变量或方法 'current_user'
Undefined local variable or method 'current_user' for Namespaced Controller
我正在使用 Devise 和 CanCan/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
不完全确定为什么条件过滤器不能按照我最初的方式工作,所以如果有人有任何见解并想分享,那么我洗耳恭听,谢谢。
我正在使用 Devise 和 CanCan/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
不完全确定为什么条件过滤器不能按照我最初的方式工作,所以如果有人有任何见解并想分享,那么我洗耳恭听,谢谢。