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.

基本的に、4 つのデータ (feed_url、last_modified、etag、および最新のエントリの URL) を保存する必要があります。次に、更新を行いたい場合は、新しいフィード オブジェクトを構築し、それに対して update を呼び出します。

于 2010-03-21T16:42:29.007 に答える
4

より明白な解決策は、 class のメソッドに:if_modified_sinceオプションを追加することだと思います。 https://github.com/pauldix/feedzirra/blob/master/lib/feedzirra/feed.rb#L116およびhttps://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のエントリ数は、新しいエントリが見つかるにつれて増え続けます。したがって、最初のフェッチで10個のエントリが見つかり、次に10個の新しいエントリが見つかった場合、@rssObject.entries.size20になります。

update新しいエントリが見つかるかどうかに関係なく、これを実行できることに注意してください。feed.updated?falseの場合feed、は元のフィードオブジェクトになり@rssObjectます。

于 2010-03-21T11:54:37.183 に答える