我使用带有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默认设置为用户模型而不是管理模型?
谢谢!
答案 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
帮助程序使您的代码更清晰,并允许您指定所需的设计模型。