jasagiri @ ウィキ
Foundations と Layers
最終更新:
jasagiri
-
view
Foundations And Layers
Waves での Layer はアプリケーションの代表的な特徴を加えたり変更したりするモジュールです。Foundation は Layer 無しでもアプリケーションを実行することができるあらゆる Layer です。
Waves での Layer はアプリケーションの代表的な特徴を加えたり変更したりするモジュールです。Foundation は Layer 無しでもアプリケーションを実行することができるあらゆる Layer です。
もしあなたがチュートリアルや他の記事を試したなら、もっとも単純な Foundation は Compact だとわかると思います。:
require 'foundations/compact' module TeaTime include Waves::Foundations::Compact end
Noice the require ステートメントで … one nice thing about Layers is that, by convention, Layers に置くことができることはコアフレームワークには含まれていません。 (i.e., require 'waves' のとき何を得ますか)。あなたは使うということに代価を払うだけです。
Looking Inside A Foundation
Foundation がどのように動作するか Classic Foundation を見てみましょう。
Foundation がどのように動作するか Classic Foundation を見てみましょう。
module Waves module Foundations module Classic def self.included( app ) require 'autocode' require 'layers/mvc' require 'layers/inflect/english' require 'helpers/extended' require 'layers/renderers/erubis'
モジュールの読み込まれたメソッドを上書きして必要とするすべてのコードが要求されるのがわかります。お分かりのように、 Autocode (コード再読み込み), MVC, inflection サポート, view ヘルパ, ERb は Waves のコアデザインに含まれていません。
app.module_eval do
include AutoCode
app.auto_create_module( :Configurations ) do include AutoCode auto_create_class :Default, Waves::Configurations::Default auto_load :Default, :directories => [ :configurations ] end
次にアプリケーションモジュールの module_eval を呼びます。AutoCode 定義をセットアップし始めます。 This one says, 「もし Default 構成が存在しないなら, ファイルから読み込もうとし、失敗したら Waves の既定に基づいて作成します。」
他にもこのような宣言はたくさんありますが、ここでは立ち入りません。基本的に、これらはアプリケーションのためにコード再読み込みと必要になったときの生成コンベンションをセットアップしています。もう少し見ると、異なった慣習の独自の Foundation を作れるようになるでしょう。
特徴を見ていきましょう。
app.auto_eval( :Resources ) do auto_create_class true, app::Resources::Default auto_load true, :directories => [ :resources ] auto_eval :Map do
handler( Waves::Dispatchers::NotFoundError ) do app::Views::Errors.new( request ).not_found_404 end
end end
ここでは リソースのコード再読み込み / 必要になったときの生成コンベンションをセットアップするだけでなく、NotFoundErrors の既定のエラーハンドラを追加し、アプリケーションの view に not_found_404 を描写させます。
次に、別の Layers を加え、順番に実行します。:
include Waves::Layers::Inflect::English include Waves::Layers::MVC include Waves::Renderers::Erubis
Layers That Modify Waves
たった3行で、inflection サポート、 MVC サポート、 ERbスタイルのテンプレートエンジンを加えました。すごい。 さて、続けましょう。 MVC Layer は何をするでしょう?
たった3行で、inflection サポート、 MVC サポート、 ERbスタイルのテンプレートエンジンを加えました。すごい。 さて、続けましょう。 MVC Layer は何をするでしょう?
module Waves module Layers module MVC
def self.included( app )
require 'layers/mvc/extensions' require 'layers/mvc/controllers'
Again,アプリケーションモジュールに含まれているメソッドを定義する身近なパターンを確認でき、新しいコードが読み込まれる時、この Layer が必要になるでしょう。一旦ここでとまって、 layers/mvc/extensions が何をするか一通り見てみましょう。
module Waves module Resources module Mixin def controller( resource = nil ) resource ||= self.class.basename @controller ||= app::Controllers[ resource ].new( @request ) end def view( resource = nil ) resource ||= self.class.basename @view ||= app::Views[ resource ].new( @request ) end end end
Woah. Waves を再起動して要素を加えましょうか。 Yep. これは Layer がするように完全に決まっています。 ここで MVC Layer はアプリケーションにResources へアクセスするためのcontrollerとviewヘルパメソッドを加えます。 Further down, もっと面白いものを見ることができます。
Layer And Foundation Etiquette
Layer のための基本的なルールはかなり簡単です。:含まれるフックを定義して、 要求される必要なコードを追加し、アプリケーションモジュールや Waves 自身さえも変更して新しい機能を取り入れてください。
Layer のための基本的なルールはかなり簡単です。:含まれるフックを定義して、 要求される必要なコードを追加し、アプリケーションモジュールや Waves 自身さえも変更して新しい機能を取り入れてください。
Foundation のルールはほんのちょっと複雑です、Foundation は基本的に保障されているので アプリケーションを実行するのには十分です。
基本的に、 Foundation はアプリケーションの Configurations モジュールを定義しなくてはならず、その中で、configuration クラスはあなたが実行するどんな構成にも対応します。 (慣習で、waves server コマンドが既定オプションなので少なくとも Development 構成を提供しなくてはなりません。)。
また、アプリケーションのために Resources モジュールを定義する必要があり、そして、その中で、アプリケーションリソースとして構成するために少なくとも1つの Resource クラスが参照されます。
Future Enhancements
Waves の Layers には将来のリリースでいくつかの改良を予定しており、 開発者が Layers を簡単に作成するのを助ける多くのものを含んでいます。また Layers 開発者ガイドも作成する予定です。
Waves の Layers には将来のリリースでいくつかの改良を予定しており、 開発者が Layers を簡単に作成するのを助ける多くのものを含んでいます。また Layers 開発者ガイドも作成する予定です。
Layers Are Just Modules
Leyers の美しさの肝は単なる Ruby モジュールということで、特徴を mixin するためには標準の Ruby フックを使います、今回はたまたまアプリケーションだということです。 「plug-in」 や 「component」インタフェースはまったく必要ありません。
Leyers の美しさの肝は単なる Ruby モジュールということで、特徴を mixin するためには標準の Ruby フックを使います、今回はたまたまアプリケーションだということです。 「plug-in」 や 「component」インタフェースはまったく必要ありません。