我正在使用设计以及 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
吗?提前谢谢。
答案 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
不完全确定为什么条件过滤器不会像我原来那样工作,所以如果有人有任何洞察力并且感觉像分享那么我会全力以赴,谢谢。