1

背景:我正在使用 rails 应用程序中的feedzirra 插件,并尝试在单个视图中同时使用已解析提要的提要和入口访问器。

为此,我创建了两个模型:feed 和 feed_entry。它们如下:

饲料.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 作业调用此函数;但我想我会先让一个工作。为了测试,我目前正在从控制台调用此函数。

问题:

NoMethodError: undefined method `id' for #<Feedzirra::Parser::RSS:0x00000100bcb0f0>
  1. 这看起来很简单,但是在调用 update_from_feed 函数时,我在控制台中收到了上述错误。虽然是 ruby​​ 和 rails 的新手,但我的印象是表中的每个新条目都有一个可以引用的 id - 在这种情况下,通过 feed.id。我在这里错过了什么吗?

  2. 我使用这个插件的 2 模型方法是一个好的方向吗?由于在我弄清楚问题 1 之前我无法验证我的方法的其余部分是否有效,因此我想我会同时要求提供有关最佳实践的提示。

  3. 我剩下的计划是在单个控制器中利用插件的 feed 和 entry 访问器,然后以某种方式在相对视图中引用这些变量。这就是我应该如何感知 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 命令是创建新提要的命令。我不记得了!

两种模式的想法似乎是一种明智的方法。稍后通过控制器访问您的提要时,您可能应该尝试嵌套资源。然后你的 URL 看起来像这样;

/feed/1/entries

你的控制器会是这样的;

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

我还没有回答你所有的问题,但希望这是一个开始。

于 2011-10-14T11:44:39.467 回答