Rails的设计after_sign_in_path_for(资源)的方法并不按预期

我想重定向不活动的用户来注册路径收集一些信息。 下面是我拿了但也不是工作两种方法:

我推翻了色器件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

当我迷上高达调试的代码,我看就是图谋不会调用after_sign_in_path_for。 此外,正在此调用生成正确的网址:

(rdb:2) after_sign_in_path_for(resource) "/users/edit.1"

然而,当我看着服务器日志,也被没有试图重定向到“/users/edit.1”在任何情况下。

我曾尝试移动上面的方法来application_helper.rb,session_controller.rb(通过扩展设计:: SessionController)和session_helper.rb

问题是能想出不会调用此方法检索的网址,但它从来没有尝试重定向。 我检查了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

--------------解决方案-------------

你确定你要重定向到/users/edit.1 ? Rails会挑选起来就好像你试图访问1 ,而不是HTML文档的MIME类型。

用户注册路径并不需要一个id,因为它总是属于在当前登录用户。 这应该是足够了:

def after_sign_in_path_for(resource)
if account_active
root_path
else
edit_user_registration_path
end
end

另外,把它放在ApplicationController是正确的位置。 如果你有自己的会话控制器,如Users::SessionsController ,从继承Devise::SessionsController ,比它可以去那里了。

所以,无论是account_active方法不会做你认为这样做,或者你已经搞砸了路由文件。 试着在你的路由更香草的配置工作,看看是否是这样的:

devise_for :users

PS。 作为一个完整的一个完全不相关的边注:请尽量使用Ruby编码规范,像没有分号不是在需要的时候,在没有括号if语句,2位缩进,无不需要return语句。

这可能并不适用于你,但我最近用色器件+ active_admin的,我遇到了你所描述的同样的问题。 我说,而我的发展轨道服务器运行的色器件覆盖,并承担导轨/色器件会自动选取方法。 显然不是,因为当我重新启动我的服务器上的问题得到解决。

如此看来,遗赠是采摘樱桃这些方法关闭ApplicationController初始化时,虽然我还没有看的来源。

分类:Ruby on Rails的 时间:2012-09-27 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.428 (s). 10 q(s)