以下方法是我继承的一些代码,它应该从网址中删除参数,但它会因以下错误而中断:
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字符串问题?
答案 0 :(得分:1)
uri.query
似乎是Ruby Hash对象,#reject
将拒绝符合块中描述的谓词的对象中的条目。第一个筛子会删除不在白名单中的密钥,第二个筛子会根据以utm_
开头的密钥或removeParams
内的密钥进行拒绝。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>