RSS Reader 作成で復習!

  • おさらいをかねて,RadRailsで新しいプロジェクトをつくるところから復習.
  • ライド・オン・Rails そのままのコードです.とくに,parserss.rb と getrss.rb はとても勉強になります.
プロジェクト作成
  • Rails Naviから New - Project で ”Rails Project”を選択し,ProjectNameを記入し,プロジェクトのデフォルトファイル群を作成.

モデル

  • RadRailsの下にあるコンソールからRubyのコマンドがうてないから,しょうがないから,Ruby Consoleを別途立ち上げる.
  • D:\work\rails\RssReader でモデルをgenerateする
> D: 
> cd D:\work\rails\RssReader 

> ruby script/generate mode Blog
> ruby script/generate mode Post
  • ProjectをSVN に追加.参照→http://d.hatena.ne.jp/ooolong/20070131/1170252485
  • 今回は,MySQL CommandLine Client でNewSchemaを作成.root でログインする.grant でユーザawa にアクセス権限を与えるんだけど,どうもできてないみたい.仕方ないので,SQL Administratorでやってしまおう.
mysql> create database RssReader;
mysql> grant all on RssReader.* to awa@localhost;
  • database.xml の修正
  • 0XX_create_blogs.rb,0XX_create_postss.rb を修正
  • rake db:migrate マイグレートして,DBにテーブルを作成と重きや...エラーが.awaではAccessできないみたい.うーん.またしてもしょうがないので,database.yml の username: を root でやってしまおう.コンソールから,rake migrate でもよいし,RailsのRakeTasksウインドウからでもよい.
  • SQL Administrator で作成されたテーブルを確認してみる.
rake db:migrate
  • blog.rb post.rb を修正
class Blog < ActiveRecord::Base
  has_many :posts
  validates_uniqueness_of :rss_url
  validates_uniqueness_of :url
end
class Post < ActiveRecord::Base
  belongs_to :blog
  validates_uniqueness_of :url  
end

GetterとParser 作成

  • RSSを解析するRuby標準ライブラリ RSS::Parser を使う
  • RAILS_ROOT に,parserss.rb を作成
require 'rss/1.0'
require 'rss/2.0'
require 'rss/dublincore'
require 'rss/content'
rss = nil
open('rss.xml') do |rss_source|
  begin
    rss = RSS::Parser.parse(rss_source)
  rescue RSS::InvalidRSSError
    rss = RSS::Parser.parse(rss_source, false)
  end
end
require 'config/environment'
include RssrHelper
rss_url = ARGV.shift || 'http://moriq.tdiary.net/index.rdf'
rss_url = url_normalize(rss_url)
blog = Blog.find_by_rss_url(rss_url) || Blog.new(:rss_url => rss_url)
blog.name = rss.channel.title
blog.url = rss.channel.link
blog.save
rss.items.each do |item|
  url = url_normalize(item.link)
  post = Post.find_by_url(url) || Post.new(:url => url)
  post.blog = blog
  post.title = item.title
  begin
    post.content = item.content_encoded
  rescue
    post.content = item.description
  end
  post.published_at = item.date
  post.save
end
  • RAILS_ROOT に,getrss.rb を作成
require 'config/environment'
require 'open-uri'
include RssrHelper
rss_url = ARGV.shift || 'http://moriq.tdiary.net/index.rdf'
rss_url = url_normalize(rss_url)
blog = Blog.find_by_rss_url(rss_url) || Blog.new(:rss_url => rss_url)
header = {}
if blog.updated_at
  header['If-Modified-Since'] = blog.updated_at.httpdate
end
begin
  open(blog.rss_url, header) do |rss_source|
    open('rss.xml', 'w') do |o|
      o.print rss_source.read
    end
  end
rescue OpenURI::HTTPError
  p $!
  # => #<OpenURI::HTTPError: 304 Not Modified>
end
  • app/helpers/rssr_helper.rb を作成
module RssrHelper
  def url_normalize(url)
    URI.parse(url).normalize.to_s
  end
end

RSS取得とDB格納

  • getrss.rb でRSSを取得し,parserss.rb でデータベースに格納する.取得先は,デフォルト http://moriq.tdiary.net/index.rdf
  • Console から 実行する.ITmedia +D のRSSを新規登録するには...
> ruby getrss.rb http://rss.itmedia.co.jp/rss/1.0/plusd.xml
> ruby parserss.rb http://rss.itmedia.co.jp/rss/1.0/plusd.xml

コントロール,ビュー

  • あとはデータベースから find して,表示すれば,RssReader の出来上がり.

課題

  • 任意のRSSのURLを自由に登録/削除できるフォームの作成
  • RSS 更新/取得の自動化,もしくはボタン作成

参考文献

ライド・オン・Rails Ruby on Railsを徹底攻略

ライド・オン・Rails Ruby on Railsを徹底攻略