以下用于存储先前URL的ruby代码旨在排除某些系列,在这些系列中,所产生的动作可能会使用户陷入无限循环。
def current_user_url # store last url
if (request.fullpath != "/users/sign_in?locale=*" &&
request.fullpath != "/users/sign_up?locale=*" &&
request.fullpath != "/users/password?locale=*" &&
request.fullpath != "/users/sign_out?locale=*" &&
request.fullpath != "/users?locale=*" &&
!request.xhr?) # don't store ajax calls
session[:previous_url] = request.fullpath
end
end
处理自指操作时
def after_sign_in_path_for(resource)
session[:previous_url] || session[:confirm_url]
end
通配符无法正常工作,因为会话变量正在存储/users/sign_in?locale=en
,尽管使用了通配符。 注意:在不使用?locale=en
的情况下,该功能可以正常工作。
该代码如何与语言环境无关?
更新并附上解决方案说明
如果有人跌倒并受到second apporach of a wiki for the devise gem的困扰,您并不孤单。对于后置过滤器,我并没有太本能。挖掘Devise的商店位置方法是一种选择,尽管不如下面的Max解决方案那么简单。
尽管(并且[ahem,是的,问题没有提到devise)),但确实需要进行一些微调,其中路由需要调用devise_for
,而控制器需要从devise继承< / p>
devise_for :users, :controllers => { registrations: 'registrations', sessions: 'sessions' }
class SessionsController < Devise::SessionsController
skip_before_action :store_location
end
这对我来说更清洁了...维护时间...
答案 0 :(得分:1)
您可以使用不包含查询字符串的request.full_path
代替request.path
。
但是更好的解决方案是完全跳过受影响的控制器/动作上的回调,因为这样可以正确分配职责。
class ApplicationController < ActionController::Base
before_action :store_location
def store_location
session[:previous_url] = request.fullpath
end
end
class SessionsController < ApplicationController
skip_before_action :store_location
end
class UsersController < ApplicationController
skip_before_action :store_location, only: :index
end
答案 1 :(得分:0)