Adding RSS to your Rails application
Rails makes it really simple to expose your data as XML. It also makes it pretty easy to support any other type of format.
While you can do this in Rails 1.2, this writeup will focus on doing it with Edge Rails.
Assume I have a Project model, a Projects controller, and I’m using a RESTful design…
rails my_projects_rss --database=sqlite3 cd my_projects_rss ruby script\generate scaffold Project title:string description:string rake db:migrate ruby script/server
Create a new file at apps/views/projects called index.rss.builder.
Place this code in that file:
xml.rss('version' => '2.0') do xml.channel do xml.title(@page_title) xml.link(projects_url) xml.description(@page_title) @projects.each { |project| xml.item do xml.title(project.title) xml.link(project_url(project)) xml.description(project.description) xml.pubDate(project.updated_at.rfc822) end } end end
Now… take the index action in your projects controller and change it from this:
# GET /projects # GET /projects.xml def index @projects = Project.find :all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @projects} end end
to this:
# GET /projects # GET /projects.xml # get /projects.rss def index @projects = Project.find :all, :order => "update_at desc" respond_to do |format| format.html # index.html.erb format.xml { render :xml => @projects} format.rss do @page_title = "Journal entries" render :layout=>false end end end
Start up your server and add some projects. You can then navigate to http://localhost:3000/projects.rss and see the feed.
Now we’re not going to talk about how to cache the feed, but that’s easy enough to figure out.
How do I do this right now, without using Edge rails
The steps are simple.
- Use this to generate your resource scaffold:
ruby script\generate scaffold_resource Project title:string description:string
- Name the above mentioned RSS template file projects_rss.rxml
- Use this for your controller action.
# GET /projects # GET /projects.xml # get /projects.rss def index @projects = Project.find :all, :order => "update_at desc" respond_to do |format| format.html # index.html.erb format.xml { render :text => @projects.to_xml} format.rss do @page_title = "Projects" render :action=>"projects_rss", :layout=>false end end end