= マニフェスト @ PettanStandard ぺったんRサーバーのシステム構成をjson形式のテキストファイルで目録にしたもの。これによって各種クライアントアプリケーションがぺったんRサーバーと連係できるようになる。 WebサービスはMVCで構成される。このうち、Viewの良し悪しは好みによって分かれる。通常のWebサービスはAPIを提供し、ユーザーは好みのUIを備えたクライアントを選択して利用する。サーバのAPIが安定していれば、より良いサービスを提供できる。しかしながら、ぺったんRは管理者の方針によって機能を自由に追加、削除できるので、必ずしもAPIが安定しているとは言えない。そこで、 APIと、それをcallした時の結果を配信する形にして安定化を図る試みがマニフェストである。 == マニフェストの種類 マニフェストにはグローバルマニフェストとローカルマニフェストの二種類がある。 グローバルマニフェストはこれを守らないと、クライアントが正しく動作しない性質のもの。例えばリソース名称(APIのURL)やモデルの構造など。この扱いを間違えると入力値を間違えて送信するなど、サーバとうまく連携できない。 ローカルマニフェストは外観に関係するもの。サーバが出力するページは、この設定をもとに生成される。設定通りに振る舞うことで、サーバと同じページを作ることができる。しかし、クライアントは必ずしもこれに従わなければならないわけでは無い。 この設定を無視して独自のデザインしても良い。 = グローバルマニフェスト サーバから/manifest.jsonを取得するとグローバルマニフェストを入手できる。 == ペタナイズドアイテムについて === ペタナイズドアイテムとは AboutItem === ペタナイズドアイテムのマニフェスト ManifestItem マニフェストのモデルは、拡張モデルも含めたすべてのモデルを記述している。つまり、クライアントが利用可能なリソースとしてのモデルのマニフェストと拡張データを展開するためのマニフェストとの区別がない。また、リソースごとのふるまいの違いを区別する方法もないので、モデルとは別にマニフェストを用意した。 == コントローラについて === コントローラとは AboutController === コントローラのマニフェスト ManifestController == モデルについて === モデルとは AboutModel === モデルのマニフェスト ManifestModel == システム定数について === システム定数とは AboutSystemResources === システム定数のマニフェスト ManifestSystemResources = ローカルマニフェスト サーバから/local_manifest.jsonを取得するとローカルマニフェストを入手できる。 == ファイラーについて === ファイラーとは AboutFiler === ファイラーのマニフェスト ManifestFiler == プロファイラーについて === プロファイラーとは AboutProfiler === プロファイラーのマニフェスト ManifestProfiler == リストグループについて === リストグループとは AboutListGroup モデルが搭載している一覧取得メソッドが設定されているが、、この情報だけでは期待する一覧を取得することができない。そもそも一覧を取得するためのロジックを外部のクライアントが知る必要がないのである。クライアントはapiを叩けば一覧が返ることさえわかればよいのである。よって、モデルのマニフェストではは詳細なロジックについての設定は記述されない。そこを補足するための設定が、このマニフェストである。 === リストグループのマニフェスト ManifestListGroup == 入力フォームについて === 入力フォームとは AboutForm 大雑把な入力フォームであれば、モデルのマニフェストから生成することは十分に可能である。しかしながら、使い勝手の良い見やすいフォームを表示しようと思うと、それなりな配慮が必要である。そこを補足するための設定が、このマニフェストである。 === 入力フォームのマニフェスト ManifestForm == 国際化について = ManifestBase = Locmare Local Manifest Renderを省略した。 マニフェストおよびローカルマニフェストは、ユーザに提供する画面を作り出すために定義したものなので、最終的にはそれを出力するための仕組みが必要。Locmareは、マニフェストで定義されたものを、画面に描画したり実行したりする。レンダラとかついているけど、描画しないものもある。 === ファイラーについて LocmareFiler === プロファイラーについて LocmareProfiler === リストグループについて LocmareListGroup === 入力フォームについて LocmareForm == 共通するお約束 なお、テンプレートはJavaScriptで動くことを考慮して、移植性の高い形にしておくのが理想と思われる。今回はbackboneとアンダースコアを利用することを念頭に実装した。 テンプレートにはロジックを書くこともできるが、テンプレート内で条件分岐を繰り返すと、かえって処理を複雑にしてしまう。テンプレートには、極力ロジックを埋めこまない前提で、分岐処理はManifestViewのテンプレートファイル切り替えで行うようにしたい。 テンプレートは基本的には一つのディレクトリに収められるが、条件分岐で切り替えられるテンプレートについては、一つ下の階層のディレクトリに収める。 例えば、testブロックがfooとbarのどちらかの部品を表示するとき、テンプレートの配置は次のようになる。 {{{ test.html.erb test/ foo.html.erb bar.html.erb }}} = Railsでの実装 == マニフェストの読み込み マニフェストは頻繁に変更されるものではないので、サーバ起動時に読み込んでおく。グローバルマニフェスト、ローカルマニフェストともに読み込む。マニフェストに従ってペタナイズを行い、システムリソースを必要に応じて書き換える。 == かなり注意 Railsは、サーバ起動時の環境設定の順序がけっこう複雑なので、マニフェストを読み込む順番に気を付けないと期待したように動作しない。 アプリケーションを起動する時、ルートの記述から行う。ルートの設定ではライセンスグループや吹き出しテンプレートをマニフェストから動的に読み込むので、必ずマニフェストを先に読み込まなければならない。具体的にはrbでアプリケーションのconfigurationを行う前に読み込む。 しかし、この段階では、マニフェストの初期化に必要な情報が全く設定されていないので、マニフェストを準備することはできない。つまり、マニフェストの起動にはアプリケーションのconfigが必要だが、それを実行するにはマニフェストが必要という問題になる。 そこで、ルーティングに必要な情報(システムリソース)だけを先に読み込んで、仮のインスタンスを作成しておき、アプリケーションのconfigが完了した後、別途マニフェストを初期化する。