1

试图让我的头脑在这里围绕Feedzirra

我已经完成了所有设置和一切,甚至可以获得结果和更新,但是发生了一些奇怪的事情。

我想出了以下代码:

  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

因为这会用一个全新的提要对象重新初始化我的实例变量,并且更新会再次出现。

但这也意味着在那个确切时刻添加的任何新更新都会丢失,以及大量的矫枉过正,因为我必须再次加载该东西。

提前致谢!

4

3 回答 3

6

对于当前的 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)。然后,当您想要进行更新时,您可以构建一个新的提要对象并对其调用更新。

于 2010-03-21T16:42:29.007 回答
4

我认为更明显的解决方案是在类方法中添加:if_modified_since选项,请参阅https://github.com/pauldix/feedzirra/blob/master/lib/feedzirra/feed.rb#L116https://github.com /pauldix/feedzirra/blob/master/lib/feedzirra/feed.rb#L206fetch_and_parseFeed

于 2011-05-20T19:36:45.787 回答
0

您可以重置@rssObject为更新的提要。

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

随着新条目的发现,@rssObject 中的条目数量将不断增加。因此,如果第一次 fetch 找到 10 个条目,然后下一次找到 10 个新条目,则为@rssObject.entries.size20。

请注意,无论是否update找到新条目,您都可以执行此操作。如果feed.updated?为 false,feed将是原始提要对象,@rssObject.

于 2010-03-21T11:54:37.183 回答