2016-11-10 3 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, как представляется, объект Руби Hash, #reject отклонит записи в объекте, которые соответствуют предикат, описанный в блоке. Первое сито удаляет ключи не в белом списке, второй - на основе ключей, начинающихся с utm_ или ключей, которые находятся в пределах removeParams.
  2. Просто выполните url.gsub!(/\P{ASCII}/, '') на линии сразу после определения функции. Это регулярное выражение вычеркивает для вас символы не ASCII. (Как и в стороне #gsub! изменяет оригинал, а #gsub возвращает копию, это общий рубин соглашение, что вы увидите, как вы начинаете изучать язык более)
+0

сразу после определения функции? Не уверен, что добавление url.gsub! (/ \ P {ASCII} /, '') сразу после функции def будет делать.? – Doublespeed

+0

Он вычеркнет все символы, отличные от ASCII. –

0

Для того, чтобы сохранить ваши данные и синтаксический анализ правильно, попробуйте это

URI.parse(URI.encode('http://example.com/?йцу=1')) 
=> #<URI::HTTP http://example.com/?%D0%B9%D1%86%D1%83=1> 
Смежные вопросы