class ‹‹ self, alias_method и исправление обезьяны Mechanize::Cookie

У меня возникла проблема с неправильной работой Mechanize::Cookie, и я хочу попытаться ее исправить. Мой код:

class Mechanize::Cookie
  class << self; alias_method :old_parse, :parse end
  def self.parse(uri, str, log = Mechanize.log)
    puts 'new parse!'
    #str.gsub!(/domain[^;]*;/,'')
    old_parse(uri, str, log)
  end
end

когда я добавляю это, файлы cookie не добавляются, и я не могу понять, почему.

Изменить: чтобы увидеть проблему, попробуйте этот код с патчем обезьяны и без него:

agent = Mechanize.new
agent.get 'http://www.google.com/'
pp agent.cookie_jar

Без патча вы увидите полную банку печенья, с ним пустую.


person pguardiario    schedule 02.11.2011    source источник
comment
Делает новый разбор! распечатать?   -  person Andrew Grimm    schedule 02.11.2011
comment
Да, новый разбор! распечатывается, и я могу сказать, что old_parse тоже вызывается, потому что я поместил туда строку «puts», чтобы проверить это. Но файлы cookie не сохраняются, когда я включаю этот код.   -  person pguardiario    schedule 02.11.2011
comment
И файлы cookie сохранялись, когда вы не вводили код, верно?   -  person Andrew Grimm    schedule 02.11.2011
comment
@Андрей, верно. Я отредактировал свой вопрос, чтобы показать проблему.   -  person pguardiario    schedule 02.11.2011


Ответы (1)


Похоже, что исходный метод разбора содержит оператор yield cookie if block_given?. Вы также должны быть в состоянии пройти блок.

РЕДАКТИРОВАТЬ:

Чтобы было понятнее...

class Foo
    def self.x
        yield "yielded from x!" if block_given?
    end
end

class Foo
    class <<self
        alias :y :x
    end
    # new implementation of x's last parameter is an optional block
    def self.x(&block) 
        puts "in redefined x."
        puts "block=#{block}"
        self.y(&block) #use the block as the last parameter 
    end
end

Foo.x{|value| puts "value is '#{value}'"}
person z5h    schedule 02.11.2011
comment
Спасибо z5h, я думаю, что это правильный ответ. Я мог бы использовать другую подсказку, если она у вас есть. - person pguardiario; 02.11.2011