不确定这个ruby方法的作用

时间:2016-11-10 23:14:40

标签: ruby-on-rails ruby

以下方法是我继承的一些代码,它应该从网址中删除参数,但它会因以下错误而中断:

  

ArgumentError:URI.decode_www_form的输入必须仅为ASCII   串       /home/fatman/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/uri/common.rb:969:in   `decode_www_form'

    def self.removeUnnecessaryGetParams(url, removeParams = ["s"], whiteListParams = nil)
    uri = Addressable::URI.parse(url)

    #Get rid of UTM parameters & S parameters
    if(uri.query != nil)

        if(whiteListParams != nil)
            cleanKeyVals = URI.decode_www_form(uri.query).reject{|k, _| !whiteListParams.include?(k)}
        else
            cleanKeyVals = URI.decode_www_form(uri.query).reject{|k, _| k.start_with?("utm_") or removeParams.include?(k)}
        end

        uri.query = URI.encode_www_form(cleanKeyVals)
    end

    return uri.to_s.split("#")[0].chomp("?")
end

1)。我的问题是,这种方法究竟是如何运作的?不确定分配给cleankeyVals的行是什么(我的红宝石知识缺点)。

2)。如何解决这个仅ASCII字符串问题?

2 个答案:

答案 0 :(得分:1)

  1. uri.query似乎是Ruby Hash对象,#reject将拒绝符合块中描述的谓词的对象中的条目。第一个筛子会删除不在白名单中的密钥,第二个筛子会根据以utm_开头的密钥或removeParams内的密钥进行拒绝。
  2. 只需在功能定义后面的行上url.gsub!(/\P{ASCII}/, '')。此正则表达式将为您删除非ASCII字符。 (作为旁边#gsub!修改原始文件,而#gsub返回副本,这是一个常见的Ruby约定,当你开始更多地探索语言时,你会看到它。)

答案 1 :(得分:0)

为了保存您的数据并正确解析,请尝试使用

URI.parse(URI.encode('http://example.com/?йцу=1'))
=> #<URI::HTTP http://example.com/?%D0%B9%D1%86%D1%83=1>