试图在这里了解 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
是的,我上面所做的是从大型Feed开始,然后才获得更新。我确信我必须做一些愚蠢的事情,因为即使我能够获得更新,并将它们存储在同一个实例变量中,在第一次之后,我再也无法获得这些更新。
显然这是因为我只用更新覆盖了我的实例变量,并且丢失了完整的feed对象。
然后我考虑将代码更改为:
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
因为这会使用全新的Feed对象重新初始化我的实例变量,并且更新会再次出现。
但这也意味着在那个确切时刻添加的任何新更新都将丢失,以及大量矫枉过正,因为我必须再次加载该内容。
提前致谢!
答案 0 :(得分: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对象并调用更新 这一点。
答案 1 :(得分:4)
我认为更明显的解决方案是将:if_modified_since
选项添加到课程fetch_and_parse
的{{1}}方法,请参阅https://github.com/pauldix/feedzirra/blob/master/lib/feedzirra/feed.rb#L116和https://github.com/pauldix/feedzirra/blob/master/lib/feedzirra/feed.rb#L206
答案 2 :(得分: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个新条目,@rssObject.entries.size
将为20。
请注意,无论update
是否找到新条目,您都可以执行此操作。如果feed.updated?
为false,则feed
将成为原始供稿对象@rssObject
。