QA@IT

Padrinoのサブアプリケーション間でヘルパーやコントローラーを共有するには?

2972 PV

Padrinoではひとつのプロジェクトに複数のアプリケーションをマウントすることができますが、ヘルパーやコントローラーを共有することはできません。同じような処理をサブアプリケーションごとに実装するのは大変ですが、なにか方法はありませんか?

回答

共通処理を記述したモジュールをregisterすることで実現できます。

コード例

config/boot.rb

# モジュールを置くパスを追加しておく
Padrino.before_load do
  Padrino.dependency_paths << Padrino.root('lib', '**', '*.rb')
end

lib/shared.rb

このモジュールをregisterするとregisteredメソッドがコールされます。引数として各アプリケーションが渡されるので、controllerメソッドやhelpersメソッド内に共通処理を記述すれば、各アプリケーションから使うことができます。

module Shared
  class << self
    def registered app
      # 共有コントローラー
      app.controller do
        get :sharedpath do
          # do something
        end
      end
      # 共有ヘルパー
      app.helpers do
        def shared_helper
          # do something
        end
      end
    end
    # 実はModule.includedを使っているだけだった
    alias :included :registered
  end
end

{app_path}/app.rb

各アプリケーションのapp.rbで、先ほどのモジュールをregisterしましょう。

class SomeApp < Padrino::Application
  register Shared
  # snip
end

まとめ

特にサブアプリケーションをパスではなくドメインでマウントしているような場合に便利です。ただし、コントローラーのURLやヘルパーのメソッド名が衝突しやすくなりますので注意しましょう。

編集 履歴 (1)
ウォッチ

この質問への回答やコメントをメールでお知らせします。