Ruby通配符在路径上

时间:2019-04-22 15:03:06

标签: ruby

以下用于存储先前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

这对我来说更清洁了...维护时间...

2 个答案:

答案 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)

通配符在字符串比较中不起作用,这只是直接的逐字符相等性检查。

您需要使用正则表达式,并检查match或使用String#[]

if (!request.fullpath[%r{\A/users/sign_in\?locale=.*\z}] &&
  ...