Railsプロジェクトディレクトリのconfig/initializersディレクトリにS2Rails設定ファイルを保存します。
Railsプロジェクトディレクトリのapp/controllers/application_controller.rbで定義されている ApplicationControllerクラスに次のprocessメソッドを追記します。
class ApplicationController < ActionController::Base ... def self.process(request, response) container = S2Rails.get_s2container(request) if container && container.has_component_def(self) result = container.get(self).process(request, response) begin container.destroy rescue => e s2logger.error(self) {"destroy of s2container failed. #{e.message} #{e.backtrace}"} end return result else return super # new.process(request, response); end end ... end
セットアップでインストールしたS2Rails設定ファイル(s2rails.rb)では、次の3つの処理を実施しています。
S2Rails::Rack Middlewareでは、S2ApplicationContextの初期設定を行っています。
instantiate_controllerメソッドは、ApplicationControllerクラスに追記したprocessメソッド内で使用されます。
ActionControllerを生成するS2Containerは、S2Rails::Rack Middlewareで初期化されたS2ApplicationContextによって生成されます。 S2Containerの生成の際に指定するコンポーネントのネームスペースには、コントローラ名を使用します。また、S2Rails.IncludeNamespaces定数に設定されているnamespaceも使用されます。 S2Rails.IncludeNamespaces定数には、デフォルト値として %w[services daos models interceptors dbi] が設定されています。 これらのnamespaceに含まれるコンポーネントを持つS2Containerがリクエスト毎に生成されます。
注意 | |
---|---|
S2ApplicationContextではクラス定義の読み込み時にコンポーネント登録が実施されるため(s2componentメソッド)、 環境設定が「development」の場合でも、リクエスト毎にクラス定義のeager loadingが実施されます。 |
例として、sampleコントローラを作成します。
% ruby script/generate controller sample ... create app/controllers/sample_controller.rb ... %
sampleコントローラを次のように編集します。s2componentメソッドでコンポーネントとして登録します。 namespaceオプションを省略した場合は、コントローラ名「sample」がnamespaceとなります。 attr_accessorで、helloコンポーネントを受け取るアクセッサメソッドを定義しています。
class SampleController < ApplicationController s2component attr_accessor :hello def index @result = @hello.world end end
indexアクションのテンプレートファイルを作成します。
<%=h @result %>;
Helloクラスをapp/modelsディレクトリに作成します。namespaceに「models」を指定することで、 SampleController以外のActionControllerでもHelloコンポーネントを使用できます。 共通に使用されるnamespaceは、S2Rails.IncludeNamespaces定数配列で設定されています。 SampleControllerでのみ使用したい場合は、namespaceを「sample」に設定します。
class Hello s2comp :namespace => 'models' def world return 'Hello World' end end
ブラウザで「http://localhost:3000/sample/index」にアクセスすると、「Hello World」と表示されます。
© Copyright The Seasar Foundation and the others 2008-2009, all rights reserved. |