gpt4 book ai didi

ruby - 如何覆盖ruby lib的方法?

转载 作者:数据小太阳 更新时间:2023-10-29 08:34:46 27 4
gpt4 key购买 nike

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

最佳答案

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

关于ruby - 如何覆盖ruby lib的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3214859/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com