2010-03-20 156 views
1

试图让我的脑袋周围Feedzirra here。红宝石 - 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 

嗯,我不是任何覆盖,并且应该去正确的方式?

WRONG,这意味着我注定要一直试图获得更新到相同的静态饲料对象,但我得到一个变量的更新,我从来没有真正更新我的“静态饲料对象”,新添加的项目将被添加到我的“feed.new_entries”,因为它们理论上是新的。

我敢肯定,我在这里错过了一步,但是如果有人能让我看清楚,我会非常感激。我已经经历了几个小时的这段代码,并且无法掌握它。

显然,这应该正常工作,如果我不喜欢的东西:

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

,因为这将重新初始化我的实例变量以崭新的饲料对象,并相应更新会再来。

但是这也意味着在那个时刻添加的任何新更新都将丢失,以及大规模的过度冲击,因为我不得不再次加载该东西。

在此先感谢!

+0

多久你重试你的饲料?如果你第一次得到它,那么稍后再看,如果在那个时候饲料没有更新,你可能看不到变化,让我觉得你看到了正确的行为。 还有一些需要考虑的问题是将信息保存在内存中并重用变量的潜在问题。如果您的代码死亡,您将失去该状态,并且必须重新加载您完整跟踪的所有Feed。如果您要跟踪1000个Feed,这可能会非常昂贵。对于单个Feed而言,这不是什么大问题,但对于大量数据,您需要一个用于跟踪状态的数据库。 – 2010-03-21 00:14:54

回答

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,以及最近进入的网址)。然后当你想要做更新 构建一个新的feed对象并致电更新 那。

+0

你可以保存updated_feed编组在你的分贝,而不是每次重建它? – Nader 2010-10-07 21:24:34

0

您可以将@rssObject重置为已更新的Feed。

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

@rssObject中的条目数将随着新条目的增加而持续增长。因此,如果第一次提取找到10个条目,然后接下来找到10个新条目,则​​将为20.

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