为基于Rails开发的blog增加rss输出

2007年12月14日 | 分类: 开源技术 | 标签: ,

  现在基本每一个 BLOG 都支持 RSS 阅读了,甚至很多新闻,论坛站点都支持 RSS 订阅,让我们来看看基于 Rails 开发的 BLOG 站点应该如何增加 RSS 输出呢?

  假设我们已经让我们的 BLOG 使用形如:http://www.wuwx.net/blogs 的地址来浏览了,应该怎么样规划我们的站点 URL,使得加上去之后,我们的 URL 比较友好,并且还是符合 RESTFull 的呢?

  使用 /blogs/rss ?还是 /rss/blogs ?都不是,我们知道,/blogs.xml 和 /blogs.html 表示对于 /blogs 的 xml 和 html 的两种不同的表现形式,而对于 rss 来说,同样是 /blogs 的一种特殊的表现形式。所以我们应该使用 /blogs.rss 这样的地址。

  于是我们在控制器中使用如下代码:

def index
  @blog_pages, @blogs = paginate :blogs, :order => 'id DESC'
  respond_to do |format|
    format.html
    format.xml
    format.js
    format.rss { render :action => "feed.rxml", :layout => false }
  end
end

  我们在原来系统自动生成的控制器后面增加了一条 format 规则,是 format.rss { render :action => "feed.rxml", :layout => false },这句话的含义就是如果请求的是 /blogs.rss,也就是扩展名如果请求的是 .rss,那我们就使用 feed.rxml 来渲染,并且不使用 layout。

  然后我们再编写 feed.rxml 文件,feed.rxml 文件的位置是在 /app/views/blogs/feed.rxml,最后内容如:

xml.instruct! :xml, :version=>"1.0" 
xml.rss(:version=>"2.0") {
  xml.channel {
    xml.title("猫言猫语")
    xml.link("http://www.wuwx.net")
    xml.description("严以律己·宽以待人·自强不息·知行和一")
    xml.language("zh-cn")
    for blog in @blogs
      xml.item do
        xml.title(blog.title)
        xml.description(link_to '阅读全文', blog_url(blog))
        xml.pubDate(blog.created_at.rfc2822)
        xml.link(blog_url(blog))
        xml.guid(blog_url(blog))
      end
    end
  }
}

  然后我们再访问 http://www.wuwx.net/blogs.rss,就把 blog 的内容通过 rss 输出了。

  同样,我们如果需要输出为 atom 格式,就使用 http://www.wuwx.net/blogs.atom 这样的地址,控制器内只需要增加一行 format.atom { render :action => "atom.rxml", :layout => false },然后再增加一个名为 atom.rxml 的模板文件就可以了,是不是很容易扩展,并且 URL 地址十分友好呢?

  1. alex
    2009年7月19日15:51

    如果输入http://www.wuwx.cn/blogs.rss,会出现rails错误,找不到controller: blogs.rss

  2. guyuepeitian
    2010年4月22日21:30

    我想为我的很多controller编写一个rss模板,我不知道怎么把这个controller的参数传过去,也不知道怎么告诉format.rss我要加载哪里rss模板