基本的な使用法

リクエストの処理

、前のセクション、我々は行動を生成しました。今度はそれを使ってみましょう。

まず、我々は我々のルートを確認してください。

# apps/web/config/routes.rb
get '/dashboard', to: 'dashboard#index'

 

ビューのレンダリング

その後、我々は、対応するテンプレートを編集します。

# apps/web/templates/dashboard/index.html.erb

Dashboard

 

ここで花見が着信要求を処理する方法です。

  1. ルータは、新しいインスタンスを作成Web::Controllers::Dashboard::Indexし、起動します#call
  2. アプリケーションは、新しいインスタンスを作成Web::Views::Dashboard::Indexし、起動します#render
  3. アプリケーションがブラウザにレスポンスを返します。

名前の特定のアクションのためにWeb::Controllers::Dashboard::Index、対応するビューが存在している必要がありますWeb::Views::Dashboard::Index

私たちが訪問した場合/dashboard、私たちは見るべき

Dashboard

 

私達のブラウザで。

 

バイパスレンダリング

デフォルトでは、アクションは、HTTPステータスコードとレスポンスヘッダのではなく、レスポンスのボディの世話をします。上記のように、それ委譲対応するビューをレンダリングし、この値を設定します。

時々 、私たちはこのプロセスをバイパスします。たとえば、我々は次のようにシンプルなボディを返すようにしたいですOK。この場合にはビューを必要とするためにはCPUサイクルの無駄です。

私たちはアクションからのレスポンスのボディを設定した場合、我々のアプリケーションは、ビューを無視します

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

    def call(params)
      self.body = 'OK'
    end
  end
end

ここで花見が、この場合、着信要求を処理する方法:

  1. ルータは、新しいインスタンスを作成Web::Controllers::Dashboard::Indexし、起動します#call
  2. アプリケーションは、本体がすでに設定されていることを検出し、ビューをインスタンス化しません。
  3. アプリケーションがブラウザにレスポンスを返します。

私たちが訪問した場合は/dashboard、再び、今我々が表示されるはずですOK

レスポンスボディはすでにアクションによって設定された場合は、レンダリング処理がバイパスされます。

直接身体の割り当てでは、我々は安全に対応するビューとテンプレートを削除することができます

 

初期化

アクションは、実行時に花見で私たちのためにインスタンス化される各着信要求のために、我々は自動的に新しいインスタンスを取得します。アクションはオブジェクトであるため、我々は彼らの初期化時に制御を取ることができ、最終的に注入し、当社の依存関係を。これが私たちの行動をユニットテストのために本当に有用な技術です。

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

    def initialize(greeting: Greeting.new)
      @greeting = greeting
    end

    def call(params)
      self.body = @greeting.message
    end
  end
end

我々は常に念頭に置いておく必要がある制限があります:

アクション初期化子が0のアリティを持たなければなりません。

以下の初期化子が有効です。

# no arguments
def initialize
  # ...
end

# default arguments
def initialize(greeting = Greeting.new)
  # ...
end

# keyword arguments
def initialize(greeting: Greeting.new)
  # ...
end

# options
def initialize(options = {})
  # ...
end

# splat arguments
def initialize(*args)
  # ...
end