Rails设计after_sign_in_path_for(资源)方法无法按预期运行

时间:2012-01-21 22:04:16

标签: ruby-on-rails authentication redirect devise

我想将非活动用户重定向到注册路径以收集一些信息。以下是我采取的两种方法,但两种方法都不起作用:

我按照以下方式覆盖了设计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

2 个答案:

答案 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中选择了这些方法,但我还没看过来源。