1

背景:レール アプリでfeedzirra プラグインをいじっています。解析されたフィードのフィード アクセサーとエントリ アクセサーの両方を 1 つのビューで利用しようとしています。

これを実現するために、feed と feed_entry という 2 つのモデルを作成しました。それらは次のとおりです。

フィード.rb:

class Feed < ActiveRecord::Base
  attr_accessible :title, :url, :feed_url, :last_modified, :guid
  has_many :feed_entries

  def self.update_from_feed(feed_url)
    feed = Feedzirra::Feed.fetch_and_parse(feed_url)
    add_feed(feed)
    FeedEntry.add_entries(feed.entries)
  end


  private

  def self.add_feed(feed)
    unless exists? :guid => feed.id
      create!(
        :title          => feed.title,
        :url            => feed.url,
        :feed_url       => feed.feed_url,
        :last_modified  => feed.last_modified,
        :guid           => feed.id
      )
    end
  end
end

feed_entry.rb:

class FeedEntry < ActiveRecord::Base
  attr_accessible :title, :url, :author, :summary, :content, :published, :guid
  belongs_to :feed

  def self.add_entries(entries)
    entries.each do |entry|
      unless exists? :guid => entry.id
        create!(
          :title        => entry.title,
          :url          => entry.url,
          :author       => entry.author,
          :summary      => entry.summary,
          :content      => entry.content,
          :published    => entry.published,
          :guid         => entry.id
        )
      end
    end
  end
end

Feed.update_from_feed(feed_url) を cron ジョブとして呼び出すことを目的としています。実際には、cron ジョブに複数のフィードを渡してこの関数を呼び出させることを望んでいます。しかし、私は最初に1つを機能させると考えました。テストのために、現在この関数をコンソールから呼び出しています。

質問:

NoMethodError: undefined method `id' for #<Feedzirra::Parser::RSS:0x00000100bcb0f0>
  1. これは非常に単純に思えるかもしれませんが、 update_from_feed 関数を呼び出すと、コンソールに上記のエラーが表示されます。Ruby と Rails は初めてでしたが、テーブル内のすべての新しいエントリには、参照できる ID が与えられているという印象を受けました。このシナリオでは、feed.id によってです。ここで何か不足していますか?

  2. このプラグインを使用するための私の 2 モデル アプローチは、良い方向に進んでいますか? 質問 1 を解決するまで、残りのアプローチが機能することを確認できないため、それまでの間、ベスト プラクティスに関するヒントを求めたいと思いました。

  3. 私の計画の残りの部分は、プラグインのフィード アクセサーとエントリ アクセサーを単一のコントローラー内で利用し、相対ビュー内でこれらの変数を参照することです。これは、MVC アーキテクチャを認識し、それを RESTful な方法で使用する方法ですか? その場合、FeedReader ビューでフィードとエントリのアクセサーを参照するにはどうすればよいですか?

FeedReader コントローラーは次のようになります。

class FeedEntriesController < ApplicationController
  def index
    @feed_entries = FeedEntry.all
    @feeds = Feed.all
  end
end

私はこれが投稿の雌犬だったことを知っていますが、どんな助けも本当に感謝しています.

4

1 に答える 1

1

あなたのアプローチにはいくつかの欠陥があります。

まず、フィードを更新するとき、存在するかどうかを確認しますが (素晴らしい)、存在する可能性を処理せず、とにかく新しいフィードを収集しようとします。次のようなものが必要です。

feed = Feed.find_by_url(incoming_url) # try loading an existing feed first
feed = Feedzirra::Feed.fetch_and_parse(feed_url) if !feed # if not, create a new one

最後の Feedzirra コマンドが新しいフィードを作成するコマンドであると仮定します。思い出せない!

2 つのモデルのアイデアは、賢明なアプローチのように思えます。後でコントローラーを介してフィードにアクセスするときは、ネストされたリソースを試す必要があります。次に、URL は次のようになります。

/feed/1/entries

そして、コントローラーは次のようになります。

@feed = Feed.find(params[:feed_id])
@entries = @feed.entries

すべての質問に答えたわけではありませんが、それが始まりであることを願っています。

于 2011-10-14T11:44:39.467 に答える