アクションの概要

アクションは、特定のルートに対する着信HTTPリクエストを処理するエンドポイントです。Hanamiアプリケーションでは、アクションはオブジェクトですがコントローラはそれらをグループ化するRubyモジュールです。

このデザインは、他のアクションと誤ってコンテキストを共有しない自己完結型のアクションを提供します。また、巨大なコントローラを防ぎます。これは、テスト容易性と動作制御の面でいくつかの利点があります。

 

簡単なアクション

花見にはアクションのためのジェネレータが付属しています。新しいものを作りましょう:

hanami generate action web dashboard#index

アクションを調べてみましょう:

# apps/web/controllers/dashboard/index.rb
module Web::Controllers::Dashboard
  class Index
    include Web::Action

    def call(params)
    end
  end
end

 

ネーミング

そのファイルはモジュール宣言で始まります。

最初のトークンは、アプリケーションの名前ですWeb。Hanamiは同じRubyプロセス内で複数のアプリケーションを実行できます。彼らは下に位置していapps/ます。その名前は、名前の衝突避けるために、アクションやビューなどの内部コンポーネントを格納するトップレベルのモジュールとして使用されます。アプリケーションの下で別のアクションがある場合、その2つは同じコードベース内で共存できます。Home::IndexAdmin

2番目のトークンは従来の名前です:Controllers
すべてのコントローラはその下にネストされています。
このモジュールは、アプリケーションの起動時に実行時に生成されます。

指定されたアプリケーションのWeb場合、コントローラは下にありWeb::Controllersます。

最後のビットはDashboard、私たちのコントローラです。

全体のアクション名はWeb::Controllers::Dashboard::Indexです。

アクションモジュールにあなたのアプリケーションと同じ名前をつけないでください。例えば、名前のついWebたアプリでコントローラーの名前を付けないようにしてくださいWeb。あなたのコントローラ名のようなWeb::Controllers::Web場合、あなたのアプリケーションのいくつかのコードは、ビューの中で見つからない定数に関するエラーで壊れinclude Web::Layoutます。これは、Rubyが現在のモジュールで一定のルックアップを開始するため、モジュールまたはモジュールWeb::Layout内のコードで参照される定数が変換されるため、見つからず定数検索エラーが発生するためです。
Web::Controllers::WebWeb::Controllers::Web::MyActionWeb::Controllers::Web::Layout

アプリケーションと同じ名前のコントローラーに名前を付ける必要がある場合は、コントローラーではなく、それらの名前の前にプレースを付けることで::、ビューの変更など、アプリケーションの直下から含めるべきものの名前空間の参照を明示的に設定する必要がありますあなたのコントローラの::Web::Layout代わりにインクルードinclude Web::Layoutして使用include ::Web::Actionすることができます。

 

 アクションモジュール

花見の哲学は強調相続上の組成をし、回避の枠組みスーパーアンチパターンを。このため、すべてのコンポーネントは、継承する基本クラスの代わりに含まれるモジュールとして提供されます。

Hanamiは前と同じように、同じRubyプロセス内で複数のアプリケーションを実行できます。それぞれに独自の設定があります。名前のアプリケーションから分離されたアクションを維持するにはWeb、名前付きのアプリケーションAdmin、我々は、Web::ActionAdmin::Actionそれぞれ。

この例では、指令がありinclude Web::Actionます。つまり、私たちの行動はアプリケーションの設定Webに従って動作します。

指定されたアプリケーションのWeb場合、includeするアクションmixinは次のようになりWeb::Actionます。

 

インタフェース

これをインクルードするとWeb::Action、オブジェクトはHanami :: Controllerのアクションに準拠しました。実装する必要が#callあるのは、1つの引数だけを受け入れるメソッドですparams。これは、ルータからの着信HTTP要求から来るペイロードを運ぶオブジェクトです。

このインターフェイスは、Rackを思い出させます。実際、私たちの行動はRackプロトコルと互換性があります。