5.6. RailsでS2Containerを使用する

5.6.1. 動作環境

  • Ruby-1.8.7
  • Rails-2.3.2
  • WEBrick-1.3.1

5.6.2. セットアップ

5.6.2.1. Initializerのインストール

Railsプロジェクトディレクトリのconfig/initializersディレクトリにS2Rails設定ファイルを保存します。

5.6.2.2. ApplicationControllerの設定

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

5.6.3. 概要

セットアップでインストールしたS2Rails設定ファイル(s2rails.rb)では、次の3つの処理を実施しています。

  • S2Containerの初期設定
  • S2Rails用のRack Middlewareの定義(S2Rails::Rack)と組み込み
  • ActionControllerをS2Containerで生成するinstantiate_controllerメソッドの定義

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が実施されます。


5.6.4. Dependency Injection

例として、sampleコントローラを作成します。

% ruby script/generate controller sample
      ...
      create  app/controllers/sample_controller.rb
      ...
%

sampleコントローラを次のように編集します。s2componentメソッドでコンポーネントとして登録します。 namespaceオプションを省略した場合は、コントローラ名「sample」がnamespaceとなります。 attr_accessorで、helloコンポーネントを受け取るアクセッサメソッドを定義しています。

  • app/controllers/sample_controller.rb
class SampleController < ApplicationController
  s2component
  attr_accessor :hello
  def index
    @result = @hello.world
  end
end

indexアクションのテンプレートファイルを作成します。

  • app/views/sample/index.rhtml
<%=h @result %>;

Helloクラスをapp/modelsディレクトリに作成します。namespaceに「models」を指定することで、 SampleController以外のActionControllerでもHelloコンポーネントを使用できます。 共通に使用されるnamespaceは、S2Rails.IncludeNamespaces定数配列で設定されています。 SampleControllerでのみ使用したい場合は、namespaceを「sample」に設定します。

  • app/models/hello.rb
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.