エンジニアのタナカです。
4月から新しくサイト開発に携わる方も多いのではないでしょうか?
サイト開発では殆どの場合、CMS機能を用意する必要がありますが、このCMS機能をどう実現するのかというのが最初に検討することだと思います。
CMSといえばWordPressが有名ですが、WordPressも一長一短なので、
様々な理由によりCMSのスクラッチ開発を行う場合も多いと思います。
とはいえスクラッチ開発となると開発コスト等が問題になる場合もあります。
けれども、Railsを以ってすればWordPressと同等以上のCMSを効率よく開発する事も可能です。
ということで、Rails5でのCMS開発に役立つgemを紹介したいと思いますが、
その前にまずはCMSに必要な機能を定義してみます。
CMSと言っても様々なタイプがありますが、今回はニュース・メディア系のCMSを想定しています。
ニュース・メディア系CMSでよくある機能
- ニュース(ブログ)記事投稿・編集
- 固定ページ投稿・編集
- Slug(カスタムURL)の設定
- 画像投稿
- タグ付け
- 予約投稿
- 履歴管理
- ユーザー管理
これらの機能を意識しながら、使えそうなgemを紹介いきたいと思います。
これから紹介するgemはいずれも定番のものなので、ぜひ抑えておきたいところです。
ActsAsList
記事等の並び順を管理することができ、順番の入れ替えが簡単に行えるようになります。
元々Railsに組み込まれていた機能がgemとして切りだされたものですが、Rails5でももちろん使用可能です。
FriendlyId
たとえばIDが含まれるような以下のようなURLをフレンドリーなURLにしてくれるものです。
http://example.com/states/4323454
このような人間に理解しやすいURLに置き換えることができます。
http://example.com/states/washington
WordPressではslugという機能で提供されています。
Paperclip
フォームから画像ファイルをアップロードを行う際に便利なgemで、リサイズやサムネイル作成も行ってくれます。
アップロードされた画像をS3に書き出すことも可能なので、画像まわりの処理をこのgemに任せることができます。
ActsAsTaggableOn
記事などにタグ付けを行えるgemです。 タグの追加削除が簡単に行え、タグでの検索も可能です。
予約投稿
Rails5で利用できるgemは無さそうですが、記事のモデルにpublished_atカラムを追加し、公開日時をセットする方法がよくとられています。
同モデルに以下のようなscopeを定義することで公開済みのものを簡単に取得できるようになります。
scope :published, -> { where("published_at IS NOT NULL").where("published_at <= ?", Time.now) } scope :draft, -> { where("published_at IS NULL OR published_at > ?", Time.now) }
PaperTrail
記事の履歴管理に利用できます。
記事を編集した際に、前の状態に戻すといった操作が行えるようになります。
devise
ユーザー登録やログイン認証といった機能を簡単に組み込むことができます。
アクセス権限を設定することが可能なので、adminユーザーの管理だけでなく、一般ユーザー向けにSNS的な機能を提供したい場合にも利用できます。
Storytime
これまでに上げたgemの機能を全て実現できるCMS機能が丸ごと入りのgemです。
これらの機能に加え、マルチサイトやナビゲーションの管理など、WordPressとほぼ同等の機能があり、管理画面も付いてきます。
CMSのgemはほかにもいくかリリースされていますが、Rails5対応で多機能なものはStorytime以外に無いと思います。
(固定ページの投稿、編集だけが必要であれば、ComfortableMexicanSofaもお勧めです。)
ただし残念なことに、最近はメンテナンスがあまりされていません。そのため、不具合があった場合は自分で対応することになる可能性が高いです。 (私は自分でメンテすることを前提に利用していますが、Storytimeのソースが読みやすいので問題が発生してもパッチの作成等で対応しています。)
まとめ
gemをうまく組み合わせることでCMSを効率よく開発することができます。(CMSに限った話ではないですが)
また、条件があえば、CMS全部入りのgemを利用することで、開発工数を大幅に削減することも可能です。
WordPressを独自プラグイン等で無理に拡張する前に、Railsでの開発を検討してみてはいかがでしょうか?