2016-11-10 28 views
-1

的是一些代码,我继承和它应该从URL中移除参数,但它与下面的错误打破:不知道这是什么红宝石方法做如下方法

ArgumentError: the input of URI.decode_www_form must be ASCII only string /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字符串的问题?

+0

你看过导致此错误的字符串?你试图显然给它非ASCII字符。 – Carcigenicate

+1

命名约定,使用'!= nil'和其他怪癖表明这不是由真正获得Ruby的人写的。如果有机会,也值得更新Ruby。保持最新以避免安全问题。 – tadman

回答

1
  1. uri.query似乎是Ruby的Hash对象,#reject将拒绝在满足块中描述的谓词的对象的条目。第一个筛选删除不在白名单中的密钥,第二个筛选基于以utm_开头的密钥或在removeParams之内的密钥。
  2. 只需在紧跟在函数定义之后的行上执行url.gsub!(/\P{ASCII}/, '')即可。这个正则表达式会为你删除非ASCII字符。 (顺便说一句#gsub!修改原始而#gsub返回一个副本,这是一种常见的Ruby约定,你会看到你开始探索语言更多)
+0

紧跟在函数定义之后?不知道在函数def后立即添加url.gsub!(/ \ P {ASCII} /,'')会怎样。 – Doublespeed

+0

它将去除所有非ASCII字符。 –

0

为了节省您的数据和正确解析,尝试这

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