Module: Hanami::Action::Callable

Defined in:
lib/hanami/action/callable.rb

Overview

Since:

  • 0.1.0

Instance Method Summary collapse

Instance Method Details

#call(env) ⇒ Array

Execute application logic. It implements the Rack protocol.

The request params are passed as an argument to the `#call` method.

If routed with Hanami::Router, it extracts the relevant bits from the Rack `env` (eg the requested `:id`).

Otherwise everything it's passed as it is: the full Rack `env` in production, and the given `Hash` for unit tests. See the examples below.

Application developers are forced to implement this method in their actions.

Examples:

with Hanami::Router

require 'hanami/controller'

 class Show
   include Hanami::Action

   def call(params)
     # ...
     puts params # => { id: 23 } extracted from Rack env
   end
 end

Standalone

require 'hanami/controller'

class Show
  include Hanami::Action

  def call(params)
    # ...
    puts params
      # => { :"rack.version"=>[1, 2],
      #      :"rack.input"=>#<StringIO:0x007fa563463948>, ... }
  end
end

Unit Testing

require 'hanami/controller'

class Show
  include Hanami::Action

  def call(params)
    # ...
    puts params # => { id: 23, key: 'value' } passed as it is from testing
  end
end

action   = Show.new
response = action.call({ id: 23, key: 'value' })

Parameters:

  • env (Hash)

    the full Rack env or the params. This value may vary, see the examples below.

Returns:

  • (Array)

    a serialized Rack response (eg. `[200, {}, [“Hi!”]]`)

Since:

  • 0.1.0


66
67
68
69
70
71
72
73
74
75
# File 'lib/hanami/action/callable.rb', line 66

def call(env)
  _rescue do
    @_env    = env
    @headers = ::Rack::Utils::HeaderHash.new(configuration.default_headers)
    @params  = self.class.params_class.new(@_env)
    super @params
  end

  finish
end