【问题标题】:How to override a method of ruby lib?如何覆盖ruby lib的方法?
【发布时间】:2010-07-10 02:21:09
【问题描述】:

当我使用 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 方法似乎没有被调用(我调试过)。我的代码有什么问题吗?

【问题讨论】:

    标签: ruby overriding


    【解决方案1】:

    您已经被“​​别名”的工作方式所困扰。在 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
    

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多