2011-01-17 2 views
2

Я разбираю HTML-документ и пытаюсь заменить изображение src. Кажется, что я делаю то, что хочу, когда пытаюсь использовать его в консоли, но в моей модели он, похоже, не сохраняет его. Теперь я не уверен, что то, что я делаю, неверно в способе сохранения в Rails (я пытаюсь обновить поле содержимого и заменить внешние изображения на локальные) или если он использует nokogiri, но он не сохраняет результат с использованием метода set_attributenokogiri replace

Он делает все остальное прекрасно.

before_save :replace_zemanta_images 

    def replace_zemanta_images 
    doc = Nokogiri::HTML(content) 
    unless doc.css('div.zemanta-img').blank? 
     doc.css('div.zemanta-img img').each do |img| 
     io = open(URI.parse(img[:src])) 
     if photos.find_by_data_remote_url(img[:src]).blank? 
      photo = photos.build(:data => io, :data_remote_url => img[:src]) 
      img.set_attribute('src', photo.data.url(:original)) #doesn't work! 
     end 
     end 
    end 
    end 

ответ

3

Я предполагаю, что content является атрибутом вашей модели.

Когда вы делаете img.set_attribute, вы обновляете атрибут в объекте Nokogiri::XML::Element, но это не обновляет текст content.

В конце вашего метода вам нужно будет добавить что-то вроде:

self.content = doc.to_s 
+0

совершенен, я знал, что я с видом что-то! Спасибо – holden

+0

Я также заметил, что Nokogiri, похоже, бросает и тег тела ... независимо от того, был он там или нет. Любая идея, как предотвратить это от этого? – holden

+0

Есть часто небольшие различия между HTML, который вы подаете в Nokogiri, и HTML, который вы выходите, выполняя 'doc.to_s'. Это следствие того, что он проходит через парсер, и насколько я знаю, нет способа избежать этого. – mikej

0

JackChance упоминается использовать Nokogiri::HTTP::DocumentFragment.parse(content) здесь для фрагмента (если вы не хотите теги DOCTYPE/HTML/BODY), я не повезло с этим, поскольку мой оригинальный HTML был фрагментом вместо всего документа.

Я закончил тем, используя что-то вроде этого: html = Nokogiri::HTML.fragment сначала конвертировать HTML строки фрагмента к объекту Nokogiri без ненужных тегов.

Затем, когда мы используем img.set_attribute, мы можем преобразовать обратно html.to_s

Смежные вопросы