Руби - Фидзирра и обновления - PullRequest
1 голос
/ 20 марта 2010

пытается обойти мою голову Фидзирра здесь.

У меня есть все настройки и все, и я могу даже получить результаты и обновления, но происходит что-то странное.

Я придумал следующий код:

  def initialize(feed_url)
    @feed_url = feed_url
    @rssObject =  Feedzirra::Feed.fetch_and_parse(@feed_url)
  end

  def update_from_feed_continuously()    
    @rssObject = Feedzirra::Feed.update(@rssObject)
    if @rssObject.updated?
      puts @rssObject.new_entries.count
    else
      puts "nil"
    end
  end

Правильно, то, что я делаю выше, начинается с большой подачи, а затем только с получением обновлений. Я уверен, что должен делать что-то глупое, потому что, хотя я могу получать обновления и сохранять их в одной переменной экземпляра, после первого раза я никогда не смогу получить их снова.

Очевидно, это происходит потому, что я перезаписываю переменную экземпляра только обновлениями и теряю полный объект фида.

Затем я подумал об изменении моего кода следующим образом:

  def update_from_feed_continuously()    
    feed = Feedzirra::Feed.update(@rssObject)
    if feed.updated?
      puts feed.new_entries.count
    else
      puts "nil"
    end
  end

Ну, я ничего не перезаписываю, и это должно быть правильным способом?

НЕПРАВИЛЬНО , это означает, что я обречен всегда пытаться получать обновления одного и того же статического объекта фида, поскольку, хотя я получаю обновления для переменной, я никогда не обновляю свой "статический фид" объект ", и новые добавленные элементы будут добавлены в мои" feed.new_entries ", поскольку они в теории являются новыми.

Я уверен, что здесь не хватает шага, но я был бы очень признателен, если бы кто-то мог пролить мне свет на это. Я часами просматривал этот код и не могу с ним разобраться.

Очевидно, что это должно работать нормально, если я сделал что-то вроде:

if feed.updated?
  puts feed.new_entries.count
  @rssObject = initialize(@feed_url)
else

Потому что это приведет к повторной инициализации моей переменной экземпляра новым объектом фида, и обновления будут происходить снова.

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

Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 21 марта 2010

Как делать обновления, немного противоречит текущему API. Этот пример показывает лучший способ сделать это:

# I'm using Atom here, but it could be anything. You don't need to know ahead of time.
# It will parse out to the correct format when it updates.
feed_to_update = Feedzirra::Parser::Atom.new
feed_to_update.feed_url = some_stored_feed_url
feed_to_update.etag = some_stored_feed_etag
feed_to_update.last_modified = some_stored_feed_last_modified

last_entry = Feedzirra::Parser::AtomEntry.new
last_entry.url = the_url_of_the_last_entry_for_a_feed

feed_to_update.entries = [last_entry]

updated_feed = Feedzirra::Feed.update(feed_to_update)

updated_feed.updated? # => nil if there is nothing new
updated_feed.new_entries # => [] if nothing new otherwise a collection of feedzirra entries
updated_feed.etag # => same as before if nothing new. although could change with comments added to entries.
updated_feed.last_modified # => same as before if nothing new. although could change with comments added to entries.

По сути, вам придется сохранить четыре элемента данных (feed_url, last_modified, etag и URL самой последней записи). Тогда когда ты хотите делать обновления вы создаете новый объект фида и вызываете обновление что.

4 голосов
/ 20 мая 2011

Я думаю, что более очевидным решением было бы добавить параметр :if_modified_since к fetch_and_parse методу класса Feed, см. https://github.com/pauldix/feedzirra/blob/master/lib/feedzirra/feed.rb#L116 и https://github.com/pauldix/feedzirra/blob/master/lib/feedzirra/feed.rb#L206

0 голосов
/ 21 марта 2010

Вы можете сбросить @rssObject на обновленный канал.

feed = Feedzirra::Feed.update(@rssObject)
if feed.updated?
  puts feed.new_entries.count
  @rssObject = feed
else
  puts 'nil'
end

Количество записей в @rssObject будет увеличиваться по мере обнаружения новых записей. Поэтому, если первая выборка найдет 10 записей, а затем следующая найдет 10 новых записей, @rssObject.entries.size будет равно 20.

Обратите внимание, что вы можете сделать это независимо от того, найдет ли update новые записи. Если feed.updated? равно false, feed будет исходным объектом подачи, @rssObject.

...