用google搜索ruby制作rss的办法,搜了很久都找不到,这些年头,rss已经是很hot的字眼了,所以搜到了一堆提供rss的ruby网站,FT,我要找的是ruby怎么制作rss并且在rails中输出啊。后来终于知道怎么编写了,因此想把代码留下来造福大家,但是估计大家是不可能通过google搜索到这篇文章的了,看看有无有缘人能忽忽来到这里。
首先,我要说的是另一个解决方案,因为我想typo这个著名的blog程序里面应该会有rss输出的代码,于是下来看看。一看,typo果然聪明,因为rss本质是一个xml,所以typo就在controller里把需要的内容load出来,然后通过.rxml里面的xmlbuilder来自己一个一个写出来。呃⋯⋯这样太偏门了吧。
接着下来就是我要介绍的方法。如果你还在网上寻找ruby处理rss的lib的话,看到这篇文章你就不用再去找了,因为Ruby本身就内置了rss的解释和输出的支持,并且是同时支持0.9x/1.0/2.0。
废话少来,直接上代码吧:
def feed
articles = Article.find :all,
rder => 'post_date DESC', :limit => 10
feed = RSS::Maker.make("2.0") do |maker|
maker.channel.title = "Gang of Technology"
maker.channel.description = "Gang of Technology site"
maker.channel.link = "http://up-u.com"
maker.items.do_sort = true
articles.each do |article|
item = maker.items.new_item
item.link = "http://up-u.com/archives/#{article.id}"
item.title = article.title
item.date = article.post_date
item.description = Maruku.new(article.content).to_html
end
end
send_data feed.to_s, :type => "application/rss+xml", :disposition => 'inline'
end这是本网站的rss输出的真实代码,如果你熟悉rails的话,你一定能看得懂。不过我还是来稍稍点评一下,跟rss没什么关系的我就不说了:
1. 首先是得`require ‘rss/maker’`一下。
2. `make(”2.0″)`的2.0是你要输出的rss的版本,支持的值有0.9、1.0、2.0。至于为什么用2.0,因为2.0是0.9的新版本,而其实1.0是另一家的,这个你得好好去搜一下它们的历史。
3. `maker.channel`的title、description、link是三个必填的值,但是其实按照rss规范,description不是必须的,但是这里不填的话,maker会报错。
4. `maker.items.do_sort = true`的意思是按照item的时间排一下序,不过其实我select出来的时候已经排好序了,其实要不要没有关系。
5. 接下来就是item的生成了,调用`item = maker.items.new_item`
6. rss规范里面item有好多个值,不过我这里只选了四个,其实只有link和title是必须的,date最好也输出,不然rss reader会把所有文章都当成是today,description我把全文输出了,因为我就是喜欢用rss reader看全文的人。
7. 跟着就是rails的内容了,怎么把它发送出去呢,`send_data`就行了,这里需要注意的是send_data其实是接受string,但实际上你不传string也行,但是有不会想java那样自动调用toString一把,所以我们得显式转,不然会报错,我觉得是rails的设计问题,另外就是得指定mine type,至于`:disposition => ‘inline’`,因为send_data的默认就是会强制浏览器下载,这个得改一下。
8. Maruku是什么?这个跟本次主题没有关系啦,想知道就看[这里](http://rubylib.cn/maruku-27)吧。