Как переопределить метод ruby ​​lib? - PullRequest
2 голосов
/ 09 июля 2010

Когда я использую ruby ​​1.8.7 Net :: HTTP.post_form (URI.parse (URL), params), я обнаружил, что в нем есть ошибка, см .:

https://stackoverflow.com/questions/3214502/how-to-send-an-array-with-nethttp-post-form

Мой код представляет собой обычный скрипт ruby, и я хочу переопределить этот метод (net/http.rb#set_form_data) следующим образом:

require 'net/http'
require 'uri'

module Net
  module HTTPHeader
    def set_form_data(params, sep = '&')
      params_array = params.map do |k,v|
        v.inject([]){|c, val| c << "#{urlencode(k.to_s)}=#{urlencode(val.to_s)}"}.join(sep)
      end
      self.body = params_array.join(sep)
      self.content_type = 'application/x-www-form-urlencoded'
    end
  end
end

res = Net::HTTP.post_form(URI.parse(URL),
                 {'type'=>'flowers',
                  'colors[]' => %w[red white blue] })

Но, похоже, мой set_form_data метод не был вызван (я отлажен).Что-то не так в моем коде?

1 Ответ

5 голосов
/ 09 июля 2010

Вы были немного странны в том, как работает "псевдоним".В net / http.rb мы находим:

def set_form_data(params, sep = '&')
  ...
end

alias form_data= set_form_data

Вызывающий использует псевдоним для вызова этого метода:

req.form_data = params

Когда вы переопределяете метод, псевдоним все еще застрялк исходному определению, поэтому ваш переопределенный метод никогда не будет вызван.Чтобы обойти это, вы можете заново сделать псевдоним после переопределения метода:

module Net
  module HTTPHeader
    def set_form_data(params, sep = '&')
      ..
    end
    alias form_data= set_form_data
  end
end
...