Octopressにsinatraでアプリケーションを組み込む
Octopressの課題
弊社ブログはOctopressを活用して配信されています。
- 複数人で執筆することができる(要plugin)
- ローカルで気軽に編集可能
- デザインのカスタマイズ性/機能の拡張性
などが気に入り、採用を決めました。
Octopressがあまりに使い心地がいいために、結果的に、ブログだけでなく、弊社のHPすべてがOctopressを用いてmarkdownで記述されることになりました。
ただ、そんなOctopressにも最大の弱点があります。
「動的なコンテンツ」にとにかく弱いことです。
そう、例えば「フォームでの情報送信、およびエラー処理」などです。
エントリーフォームがほしかった
弊社デザイナーの「ZOMIO」さんは
「エントリーしたのですがなかなか連絡をいただけません」
とわざわざ凸電いれていただけるだけの強者だったので幸いにも弊社で働いていただける事になりましたが、
それもそのはず、弊社HPのエントリーフォームは、実はまったく動いていなかったのです。
markdownで記述された、ただの張りぼてでした。
これではいかん!ということで、急遽システムを組み込む必要性がでてきました。
いくつかある選択肢
エントリーフォームをシステム化するにあたって、いくつかの方法論があるとは思います。
- PHPスクリプトで実装する
- rubyスクリプトで実装する
- ruby on railsで実装する
- sinatraで実装する
いずれであっても対応は可能ですが、今回のケースでは「Octopressのpreview機能がsinatraを利用している」ことに目をつけて、 sinatraで実装することを決めました。 「rake preview」でいつもブログを書いているのと同じ手順でアプリケーションを作成できることを重視した感じです。
Octopressのpreviewアプリケーションに独自実装を加える
Sinatraはrackに対応したフレームワークですので、まず見るべきファイルは「config.ru」です。
Octopress標準のconfig.ruファイルを確認してみることにしましょう。
とてもスッキリしていてわかりやすいですね。
さあここに実装していけばいいんでしょ!と、このconfig.ruの編集に乗り出す前にちょっと考えてみましょう。
そうです、このconfig.ruファイルはdeploy対象ではないのです。
このファイルはあくまでもpreview時のローカル確認のためのものなので、ここに直接手を入れても、おそらく目標を達成できないような気がしますよね?
というわけで、自分はこんな感じに2行ほど追加してみることにしました。
config.ru
octopressではsourceディレクトリ以下がdeploy対象ですので、まずそこにsinatraアプリケーションとして実装するためのコードを配置します。
source/app/app.rb
この状態でpreviewしてアプリにアクセスすると、きっちり動いているのが分かりますね!
いい感じです。
これで、アプリケーションを実装するための箱ができあがりました。
後は煮るなり焼くなり好きにしろ!というやつです。
色々端折っていますが、こんな感じでさくっと実装できます。
続いて、deploy後のサーバーで動かすための設定を施すことにします。
unicornの設定
unicornと言えばrack。rackといえばunicorn。
というわけで、何も考えずにunicornの設定ファイルを作成しましょう。
source/app/unicorn.rb
source/app/config.ru
unicornの起動
nginxの設定
nginx.conf
存在しないファイルへのアクセスを、別途起ち上げているunicornに投げることで設定完了です。
これで、Octopressを、Octopressのまま、rake preview
で本番環境と同じように全ての内容を確認可能になりました。
Octopressでいけてないその他
Octopressにおけるpagination処理って、今自分たちが活用しているバージョンでは、「all posts」に対するもののみだったんですよ。
つまり、カテゴリー毎のページ処理とか、author毎のページ処理とかやる際に、かなりいじる必要性がありました。
そのあたりの記事は別の機会にでもあげようと思います。
それではよいOctopress Lifeを!