2010-07-09 4 views
2

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

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

Мой код является регулярным рубин сценарий, и я хочу, чтобы переопределить этот метод (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 метод не был вызван (I debuged). Что-то не так в моем коде?

ответ

5

Вы были немного увлечены тем, как работает «псевдоним». В сети/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 
Смежные вопросы