acts_as_feed icon indicating copy to clipboard operation
acts_as_feed copied to clipboard

Rails/AR: Transform a Model into a Feed Representation (Feed Reader)

Features

  • Easy feed reading for ActiveRecord Models
  • Transparently support RSS and Atom
  • Update feed if feed is old (last feed update > 15 minutes)
  • Update feed if url has changed
  • Support http://url and url
  • Protect from unresponsive sites
  • Protect from giant files
  • Basic implementation of Feed and FeedEntry
  • Full test coverage

INSTALL

As gem sudo gem install acts_as_feed OR as Rails plugin: sudo gem install rss-client script/plugin install git://github.com/grosser/acts_as_feed.git

Table with (see: MIGRATION):

#essential
feed_url : string
feed_updated_at : timestamp
feed_data : text

#if you want to use a polymorphic feed
covered_id : integer
covered_type : string

Simple Model addition:

User < ActiveRecord::Base
  acts_as_feed
end

Polymorphic Model:

#leverage basic implementation (see lib/acts_as_feed/feed)
class Feed < ActsAsFeed::Feed
  belongs_to :covered, :polymorphic => true
  attr_accessible :feed_url, :covered
  after_save :update_feed
end

#roll you own
class Feed < ActiveRecord::Base
  acts_as_feed :timeout=>3 #seconds
  
  belongs_to :covered, :polymorphic => true
  
  validates_length_of :feed_url, :in=>10..250
  attr_accessible :feed_url, :covered
  
  after_save :update_feed
end

USAGE

  • Call update_feed if the feed could be out of date. If it is not, noting will be done.
  • MyFeed.create!(:feed_url="xxx.com/rss").update_feed

DATA USAGE

!If you do not extend ActsAsFeed::Feed please read /examples/raw_data_usage.txt!

#HAML view example
- if feed.filled?
  %h2="Blog: #{feed.title}"
  - for item in feed.entries[0...5]
    -date = item.published_at.to_date.to_s(:long) rescue ''#can be nil depending on parsed feed

    %h2=link_to(h(item.title),h(item.url))
    %br
    =date
    %br
    - unless item.description.blank?
      =truncate(item.description,70)  #description is always cleared with strip_tags

Alternatives

If you only want to display the feeds contents to browser-using-users, try Googles Feed API instead.
Google Feed API Google Feed API example

AUTHOR

Michael Grosser
[email protected]
Hereby placed under public domain, do what you want, just do not hold me accountable...