wolfmasa's blog

フロンターレとプログラミング関係の話題を、気が向いたときにつぶやくブログです。

2日間弱でRailsをいじってみる。

f:id:wolfmasa:20150812124939j:plain

概要

大好きなRebuild.fmのデータベースを作ってみる。

もちろん非公式で。

要件としては

  • rebuild.fmのrssを取得して、パースする
  • エピソードごとのデータにまとめて、DBに保存する
  • エピソードの一覧と詳細を見れるようにする
  • エピソードに紐付いたShowNoteも取得する
  • ShowNoteの検索をする
  • ゲストごとの情報もまとめる
  • RSSの取得頻度は調整できるようにする

あたりだろうか。

構成

SinatraRailsで迷ったけど、勉強のためにRailsを選択。

rails new

から始めて、モデルの作成、コントローラの実装、ビューの調整と進める。

とりたてて特殊なgemなどを使わずに、使ったのは"Simple-RSS"くらい。

実装

RSS Parse

Railsに入る前に、RubyRSSのパースをやってから。

"Simple-RSS"はかなり便利で、

rss = SimpleRSS.parse(open('http://feeds.rebuild.fm/rebuildfm'))

みたいにすれば、オブジェクトがとれるだけじゃなくて、mp3ファルのURLなどの、元々用意されていないタグが欲しい場合には

SimpleRSS.item_tags << 'enclosure#url'

のように、リストに追加してあげれば、簡単に拡張できる。

エンコードがASCII−8bitでなぜかとれてしまうので、変換がちょっと面倒だけど、問題ない。

Model

f:id:wolfmasa:20150812124929j:plainf:id:wolfmasa:20150812125320j:plain

エピソードのモデルを作る。

現状用意しているのは以下の通りで、ゲストに関しては追加機能扱いなので、未実装。

  • 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

f:id:wolfmasa:20150812124934j:plain

一番欲しかった、shownoteの検索機能。

ShowNoteは毎回いろんな重要なリンクが置かれているけど、どうしても100を超えるエピソードの中から探すのは大変。

時事ネタみたいなものと、後から何度でも参照できそうなものにわけたいところだけど、まずは単純な文字列検索。

結果は、リストで表示するだけの一番シンプルなもの。

View

地味に時間がかかったところ。

まずは、bootstrapをインストールして、ひたすらにerbと格闘。

いかんせん、htmlは最近少し勉強しはじめたばかりなので、トップページから1つ1つ調整してく。

エピソード詳細画面は未実装(デフォルトのまま、オブジェクト吐き出しただけ)だけど、それ以外は黒背景の暫定実装完了。

f:id:wolfmasa:20150812124923j:plain

デプロイ

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"で動かず。

f:id:wolfmasa:20150812125320j:plain

検証する前に時間切れ。

おしい。

github.com

また時間を見つけてやってみよう。