iT邦幫忙

DAY 20
13

Rails 的簡單任務系列 第 21

[RoR] 簡單產生 RSS Feeds 及簡易部落格聯播功能

RSS 是 web2.0 的特徵之一,繼續將第3日的簡單Blog及第16日的單位用暫存系統加入這 RSS Feeds 的功能,而可以在連結網址上有:

並且產生 RSS 的內容:

如何在 Project 上加入 RSS Feeds ,就看要提供哪些內容的 RSS ,如果整個網站就只有一個 RSS 的話,可就直接在現有的 Controller 之加入下述的寫法;如果要針對不同類別,提供不同的 RSS 的話,也可另產生一個專門寫 RSS Feeds 的 Controller 裡。

參考 How To Generate RSS Feeds with Rails 的程式碼的作法,來寫在自己的 Project 上:
編輯 Controller

# 在 app/controllers/blog_controller.rb 是單純的,跟一般
  def rss
   @posts = Article.find(:all, :limit => 5, :order => "created_at DESC")
# 加這一行才不會把 app/views/layouts/blog.html.erb 加入 template 之中
   render :layout => false
  end
# 而在 app/controllers/upfile_controller.rb
# 因要判斷若是單位內 IP 範圍,則全部列出;單位外只列出只能單位下載的檔案,而會以下面的條件來顯示
  def rss
    myip = getip
    if myip =~ /^1xx\.1xx\.|^192\.168\./
       @posts = Upfile.find(:all, :order => 'created_at desc')
    else
       @posts = Upfile.find_all_by_target(2, :order => 'created_at desc')
    end
   render :layout => false
  end

新增 views 中的 XML template
若依照 How To Generate RSS Feeds with Rails 範例中的 XML template 所產生的 RSS 是沒有文章的 URL hyperlink ,所以修改成:

# 編輯 app/views/blog/rss.rxml 如下的內容,而 upfile 的就參照再改成相對應的變數名稱即可。
xml.instruct! :xml, :version=>"1.0", :encoding=>"utf-8"
xml.rss(:version=>"2.0", "xmlns:atom" => "http://www.w3.org/2005/Atom"){
  xml.channel{
    xml.title("最簡單的 Blog")
    xml.link("http://alpha.tagbible.net/")
    xml.description("twtw 在鐵人賽測試用的")
    xml.language "zh-TW"
    xml.ttl "40"
    xml.atom(:link, :href => "http://alpha.tagbible.net/blog/rss",
               :rel => "self", :type => "application/rss+xml")
      for post in @posts
        xml.item do
          xml.title(post.title)
          xml.link(request.protocol + request.host_with_port +
          url_for(:controller => "blog", :action => "show", :id => post))
          xml.description(truncate(post.body))
          xml.pubDate(post.created_at.strftime("%a, %d %b %Y %H:%M:%S %z"))
          xml.guid(request.protocol + request.host_with_port +
          url_for(:controller => "blog", :action => "show", :id => post))
        end
      end
  }
}

上述一些語法,是透過 http://validator.w3.org/feed/ 測試幾次後修改的結果,也把建議加上 Missing atom:link with rel="self" 才獲得完全有效,又不會再建議要加什麼語法的 RSS 語法之確認。

接下來需要讓網址上可出現可訂閱 RSS 的連結:

# 在 app/views/layouts/blog.html.erb 加入:
<%= auto_discovery_link_tag(:rss, :action => 'rss') %>
# 而在 app/views/layouts/upfile.html.erb 加入:
<%= auto_discovery_link_tag(:rss, {:controller => 'upfile', :action => 'rss'}, {:title => '可下載檔案'}) %>
<%= auto_discovery_link_tag(:rss, {:controller => 'blog', :action => 'rss'}, {:title => '最簡單的Blog'}) %>
# 來測試看看在同一個頁面,提供不同 RSS 的訂閱連結

在暫存系統的網址上,設了兩個 RSS 的訂閱連結:

暫存系統的 RSS 內容:

製作簡單 Blog 聯播
RSS Feeds 是把資料轉成 XML 格式來供外界來讀取;而所謂的部落格聯播,則是將 RSS 的 XML 格式轉成網頁界面,在此以最簡單的方式呈獻。先安裝 simple-rss 的 gem 來作為解析 RSS 的 XML 格式之用

gem install simple-rss
# 編輯 app/controllers/demo_controller.rb
  def blogrolls
# 定義要抓的 RSS 的網址
   feeds = ['http://www.ithome.com.tw/plog/rss.php?blogId=1122&profile=rss20','http://slashdot.org/index.rdf']
   @allrss = []
# 將各 site 抓下的 rss 內容,放到 @allrss 的陣列中,供 views 來作顯示的根據
   feeds.each do |url|
    onerss = fetch_rss(url)
    @allrss << onerss
   end
  end

private
# 將 RSS 抓來的子程式
  def fetch_rss(url)
    require 'simple-rss'
    require 'open-uri'
    rss = SimpleRSS.parse open(url)
    return rss
  end

編輯 app/views/demo/blogrolls.html.erb

	<% @allrss.each do |rss| -%>
    <h2><%= link_to rss.title, rss.link -%></h2>
    <ul>
    <% rss.entries.each do |entry| -%>
       <li><%= link_to entry.title, entry.link -%><br />
       </li>
    <% end -%>
    </ul>
<% end -%>

網址連上 http://SITE/demo/blogrolls 就會如截圖所示:

簡單的 RSS 相關任務完成。


上一篇
[RoR] 中文轉漢語拼音的 permalink
下一篇
[RoR] 簡單畫出 216 網頁安全色表
系列文
Rails 的簡單任務33

1 則留言

0
gric
iT邦高手 1 級 ‧ 2009-03-14 13:10:39

感恩分享咯!

我要留言

立即登入留言