我想将非活动用户重定向到注册路径以收集一些信息。以下是我采取的两种方法,但两种方法都不起作用:
我按照以下方式覆盖了设计after_sign_in_path方法(在 application_controller.rb 中):
def after_sign_in_path_for(resource)
debugger
if(account_active)
return root_path;
else
return edit_user_registration_path(resource)
end
end
当我将代码连接到调试器时,我看到devise确实调用了after_sign_in_path_for。此外,此调用正在生成正确的URL:
(rdb:2) after_sign_in_path_for(resource)
"/users/edit.1"
但是,当我查看服务器日志时,在任何情况下都不会尝试重定向到“/users/edit.1”。
我尝试将上述方法移至 application_helper.rb,session_controller.rb(通过扩展Devise :: SessionController)和session_helper.rb
问题是devise确实调用此方法来检索url但它从不尝试重定向。我检查了Web服务器日志,然后直接设置到user_root url。
以下是来自routes.rb的相关设计配置:
devise_for :users do
resource :registration,
only: [:new, :create, :edit, :update],
path: 'users',
path_names: { new: 'sign_up' },
controller: 'devise/registrations',
as: :user_registration do
get :cancel
end
root :to => "home#index"
end
match '/user' => "products#index", :as => 'user_root'
有关我应该尝试的建议吗?
谢谢,
Tabrez
答案 0 :(得分:3)
您确定要重定向到/users/edit.1
吗? Rails会选择它,就像你试图访问1
mime-type而不是html一样。
用户注册路径不需要id,因为它始终属于当前登录的用户。这应该足够了:
def after_sign_in_path_for(resource)
if account_active
root_path
else
edit_user_registration_path
end
end
此外,将其置于ApplicationController
是正确的位置。如果您拥有自己的会话控制器,例如继承自Users::SessionsController
的{{1}},那么它也可以进入。
因此,Devise::SessionsController
方法不会按照您的想法执行,或者您已经搞砸了路径文件。尝试在路线中使用更香草的配置,看看是否是这种情况:
account_active
PS。作为一个完全不相关的旁注:请尝试使用Ruby编码约定,例如在不需要时不使用分号,devise_for :users
语句中没有括号,2个空格缩进和没有不需要的返回语句。
答案 1 :(得分:0)
这可能不适用于您,但在我最近使用的devise + active_admin中,我遇到了您所描述的相同问题。我在开发rails服务器运行时添加了设计覆盖,并假设rails / devise将自动获取该方法。显然不是因为当我重新启动我的服务器时,问题就解决了。
似乎设计在初始化时从ApplicationController
中选择了这些方法,但我还没看过来源。