rss

阅读更多

通过BAIDU的快照看到这个文章的,原文章地址已经打不开了,只好转来,给更多的提供便利,应该是Sparkle写的,感谢一下~

用google搜索ruby制作rss的办法,搜了很久都找不到,这些年头,rss已经是很hot的字眼了,所以搜到了一堆提供rssruby网站,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。

废话少来,直接上代码吧:

ruby 代码
  1. require 'rss/maker'  

 


   
   
   
   
ruby 代码
  1. def feed   
  2.      
  3. articles = Article.find :all:order => 'post_date DESC', :limit => 10   
  4.   feed = RSS::Maker.make("2.0"do |maker|   
  5.     maker.channel.title = "Gang of Technology"  
  6.     maker.channel.description = "Gang of Technology site"  
  7.     maker.channel.link = "http://up-u.com"    
  8.     maker.items.do_sort = true    
  9.     articles.each do |article|   
  10.       item = maker.items.new_item   
  11.       item.link = "http://up-u.com/archives/#{article.id}"  
  12.       item.title = article.title   
  13.       item.date = article.post_date   
  14.       item.description = Maruku.new(article.content).to_html   
  15.     end  
  16.   end  
  17.   send_data feed.to_s, :type => "application/rss+xml":disposition => 'inline'   
  18. 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就行了,这里需要注意的是senddata其实是接受string,但实际上你不传string也行,但是有不会想java那样自动调用toString一把,所以我们得显式转,不然会报错,我觉得是rails的设计问题,另外就是得指定mine type,至于:disposition => 'inline',因为senddata的默认就是会强制浏览器下载,这个得改一下。

另一种实现方法

ruby 代码
  1. xml.instruct! :xml:version=>"1.0"    
  2. xml.rss(:version=>"2.0"){   
  3.   xml.channel{   
  4.     xml.title("RSS")   
  5.     xml.link("http://")   
  6.     xml.description("description")   
  7.     xml.language("zh-cn")   
  8.     for opus in @opus  
  9.       xml.item do  
  10.         xml.title(opus.title)   
  11.         xml.description(opus.description)   
  12.         # rfc822   
  13.         xml.pubDate(opus.created_at.strftime("%a, %d %b %Y %H:%M:%S %z"))   
  14.         xml.link("url")   
  15.       end  
  16.     end  
  17.   }   
  18. }  

你可能感兴趣的:(Ruby,Rails,XML,Google,UP)