Rails 製の CMS Radiant の拡張方式 Extensions

Written by @dr_taka_n at 2009/05/10 01:37 [, , , ]

Rails で作成された CMS に Radiant というものがある。

とあるサイトはスクラッチで書いており、今後の機能拡張が必要となっていた。 メインとなるのが管理者機能の充実、コンテンツ管理機能の拡張であるのだが、既存のソースを眺めつつ、手を入れ始める前に少し考えた。 今後のことを考えた時に、既存のものを拡張することがベストなのか、他に存在する何らかの CMS を利用した方が拡張性、メンテナンス性が高いのではないかと。

CMS を利用した場合、そのアプリケーションを把握するコスト、そのアプリケーションの持つ制約、また、OSS の場合にはそのコミュニティーの動向がまず気になるところ。今回幾つか検討してみて、現状2つの CMS を調査している。 先に触れた Radiant CMS と、Spree - Open Source Commerce for Ruby on Rails になる。

まだ結論は出ていないのだが、利用目的にもマッチしており、両方ともその設計思想をとても気に入っている。 おそらくベースアプリケーションとして使っていくことになる気がしている。

両方のアプリケーションの拡張性の部分において、Extensions という方式をとっている。ここではそれについて少し触れておく。

Radiant の Extensions による拡張

Radiant は柔軟なコンテンツ管理機能を持っているので、直接プログラミングを行わなくとも、その機能を利用することで大半のことは行える。 画面のレイアウトの変更であったり、表示するコンテンツのカスタマイズであったり。

しかし、利用者の全てのニーズを満すことはまず無理なことであり、それを無理やりアプリケーションの core の部分でやってしまうと、それが逆にそのアプリケーションの制約となってしまうケースが多い。Radiant ではそこを Extensions という方式を採用することでうまくやっている。

Radiant の Wiki に書かれている言葉を借りると、

Part of what makes Radiant great is that it fulfills the need for most content-management scenarios with pages, layouts and snippets. It’s flexible and puts minimal restriction on the structure of the output. It reaches the 80% window. However there are those cases in the missing 20% where you might have other needs, for example:

・Integration with some back-end data service
・Management of a complex data structure that doesn’t fit into the Radiant page-layout-snippet structure (or fits poorly)
・Receiving and processing input from the website visitor through forms or other means
・Complex manipulation of content information that would be impossible or too cumbersome using Radius

Extensions are vertical slices of a Rails application, or mini-applications if you will, that are inserted into Radiant at runtime. In many ways, they tackle the same problem as Rails Engines or Merb Slices, which allow you to drop a pre-built application into your own and use it as if it were the same app. The execution of this feat has been quite arduous, and you can read more about it on John Long’s blog. Suffice it to say, with a minimal amount of boilerplate, you can have your own custom models, views, controllers, and libraries running inside Radiant. That’s the power of extensions.

以下は、上記の超訳。


Radiant の素晴らしいところは、pages、layouts、snippets を利用してコンテンツのマネージメントシナリオの大半のニーズを満たしてくれるところです。それは柔軟であり、出力の構造においては最小限の制約しかありません。やりたいことの 80% はそれでまかなってくれます。しかしながら、利用者が持っている残りの 20% のニーズがあります。例えば以下のようなものです。

  • バックエンドのデータサービスとの統合
  • Radiant の持っているRadiant page-layout-snippet structureにフィットしない、もしくは、不十分である、複雑な構造を持っているデータの管理
  • Web サイトの訪問者からフォーム、もしくは、他の手段を用いて入力情報を取得したり、処理したりすること
  • Radiant の使用においては不可能、もしくは、あまりにも扱いにくい複雑なコンテンツ情報の操作

Extensions は、Rails アプリケーションのvertical slicesです。あなたが望むならミニアプリケーションとも言えるでしょう。それはアプリケーション実行時に Radiant に組み込まれます。 事前に作成されたアプリケーションをまるで同じアプリケーションであるかのように、自身のアプリケーションの中に組み込み、それを利用するやり方は、これまで多くの方法によって取り組まれてきました。Rails Engines であったり、Merb Slices であったり。 この技術の取り組みはちょっとばかり骨の折れるものでした。このことについての詳細は、Wiseheart Design - Rails Needs Something Better Than Engines で読むことができます。 最小限の常套手段を用いることで、あなたは Radiant の中で動作する自身のカスタマイズされたコントローラ、ビュー、モデル、そしてライブラリを持つことが可能となります。
そう、それが Extensions の力なのです。 * * * * * 超訳ここまで。

必要な機能は Extension を使って、足りないところだけを追加することができる。既存の Radiant 本体のソースに直接手を入れる必要もない。また、サイト訪問者向けの機能だけでなく、既存の管理画面に対する拡張も柔軟に行える。 以下のコンテンツを見てみると、必要な手順は必要最小限だということがわかる。

実際のところ、上記でいうところの残りの 20% の大半は、既存の作成されている Extensions で埋めることができる。こんな機能を追加したいのだが・・・という場合には、作る前に一度既にある Extensions を確認してみるのがよい。

非常によくできている Extensions が多数存在する。

  • 充分にテストされている core となる Radiant をベースとする
  • 足りないものは既存の Extensions を調査し、利用可能なものは採用する
  • サービス固有の要件は独自の Extensions で拡張する

上記のやり方が、メンテナンス性、スピード感というところでベターだと思う今日この頃。

その他の参照サイト

blog comments powered by Disqus