rails设计gem重定向循环

时间:2014-10-08 17:43:29

标签: redirect ruby-on-rails-4 devise

我使用带有rails 4.1.4 app的devise gem,并且需要在用户登录后立即在会话变量中添加一些自定义键值对。

I超越以下方法

after_sign_in_path_for(resource)
after_sign_up_path_for(resource)
after_update_path_for(resource)
这里规定的after_resetting_password_path_for(resource)方法:

https://github.com/plataformatec/devise/wiki/How-To:-redirect-to-a-specific-page-on-successful-sign-in

然而,在登录时,我多次输入after_sign_in_path_for,输出如下:

Started GET "/users/sign_in" for 127.0.0.1 at 2014-10-08 22:56:45 +0530 Processing by Devise::SessionsController#new as HTML
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
Redirected to http://localhost:3000/users/sign_in Filter chain halted as :require_no_authentication rendered or redirected Completed 302 Found in 3ms (ActiveRecord: 0.6ms)

每次,最后将我重定向到根路径之前。 (在将我重定向到根目录之前,浏览器会暂时显示重定向循环错误消息。)

编辑:

事实证明,由于我有2个不同的设计模型(用户和管理员),after_sign_in_path_for中的这行代码:

sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http')

正在创建网址"http://localhost:3000/admins/sign_in"而不是"http://localhost:3000/users/sign_in"

如何将url_for默认设置为用户模型而不是管理模型?

谢谢!

1 个答案:

答案 0 :(得分:0)

自己进入这个问题。无论出于何种原因,url_for似乎默认为管理员(不知道为什么)。好消息是您不必使用url_for来完成此任务。

相反,摆脱

sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http')

并替换

if request.referer == sign_in_url

if request.referer == new_user_session_url

帮助程序使您的代码更清晰,并允许您指定所需的设计模型。