如何覆盖ruby lib的方法?

时间:2010-07-09 16:57:18

标签: ruby override

当我使用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 个答案:

答案 0 :(得分:5)

你对“别名”的运作方式有点怪癖。在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