2日間弱でRailsをいじってみる。
概要
大好きなRebuild.fmのデータベースを作ってみる。
もちろん非公式で。
要件としては
- rebuild.fmのrssを取得して、パースする
- エピソードごとのデータにまとめて、DBに保存する
- エピソードの一覧と詳細を見れるようにする
- エピソードに紐付いたShowNoteも取得する
- ShowNoteの検索をする
- ゲストごとの情報もまとめる
- RSSの取得頻度は調整できるようにする
あたりだろうか。
構成
SinatraかRailsで迷ったけど、勉強のためにRailsを選択。
rails new
から始めて、モデルの作成、コントローラの実装、ビューの調整と進める。
とりたてて特殊なgemなどを使わずに、使ったのは"Simple-RSS"くらい。
実装
RSS Parse
Railsに入る前に、RubyでRSSのパースをやってから。
"Simple-RSS"はかなり便利で、
rss = SimpleRSS.parse(open('http://feeds.rebuild.fm/rebuildfm'))
みたいにすれば、オブジェクトがとれるだけじゃなくて、mp3ファルのURLなどの、元々用意されていないタグが欲しい場合には
SimpleRSS.item_tags << 'enclosure#url'
のように、リストに追加してあげれば、簡単に拡張できる。
エンコードがASCII−8bitでなぜかとれてしまうので、変換がちょっと面倒だけど、問題ない。
Model
エピソードのモデルを作る。
現状用意しているのは以下の通りで、ゲストに関しては追加機能扱いなので、未実装。
- title: エピソードのタイトル
- link: エピソードのページへのリンク(例えば、rebuild.fm/103a/)
- pubDate: 更新日。RSSにあるデータそのまま。
- agenda: 説明文の最初の一文。大体、〜さんと、〜について話しました。
- description: RSSにある説明文。HTML形式がエスケープされているので、地味にパースが面倒。
- duration: Podcastの再生時間。
- no: エピソードナンバー。AfterShowも同じ番号なので一意じゃない。
- mp3: mp3ファイルへのリンク。
- shownote: ShowNoteオブジェクトへのリンク。複数持つ。
ShowNoteに関しても、オブジェクトとして扱う。
- title: 表示タイトル。descriptionから抜くため、エスケープ済みなので変換が必要。
- link: 記事への実際のリンク。
- episode_id: 対応するエピソード。1対多の関係性なので、こちらは複数持たない。
Controller
特徴的な機能は2つ。
update
RSSを取得して、DBを更新する。
まずは、'/update'APIとして用意してみた。連続で叩かれると良くないので、本当は時間感覚をあけて、かつ外部から叩かれないようにするべきだが、未実装。
処理内容は、simple-rssを使って、各モデルに変換し、保存する。
毎回DBをクリアして、保存し直してるのもいけてない。かぶらないようにidが増えていくのも印象が良くないし、要改良。
search
一番欲しかった、shownoteの検索機能。
ShowNoteは毎回いろんな重要なリンクが置かれているけど、どうしても100を超えるエピソードの中から探すのは大変。
時事ネタみたいなものと、後から何度でも参照できそうなものにわけたいところだけど、まずは単純な文字列検索。
結果は、リストで表示するだけの一番シンプルなもの。
View
地味に時間がかかったところ。
まずは、bootstrapをインストールして、ひたすらにerbと格闘。
いかんせん、htmlは最近少し勉強しはじめたばかりなので、トップページから1つ1つ調整してく。
エピソード詳細画面は未実装(デフォルトのまま、オブジェクト吐き出しただけ)だけど、それ以外は黒背景の暫定実装完了。
デプロイ
railsをデプロイするならherokuでしょう、ということで、やってみる。
事前に、Gemfileを編集して、
group :production do gem 'pg' gem 'rails_12factor', '0.0.2' end group :development do gem 'sqlite3' # .... end
DBのbundleを設定して、
heroku login heroku create git push heroku master
でpushまでは成功。
が
heroku open
して見てみると、見事に”Application Error"で動かず。
検証する前に時間切れ。
おしい。
また時間を見つけてやってみよう。