Request

In order to access the metadata coming from a HTTP request, an action has a private object request that derives from Rack::Request. Here an example of some information that we can introspect.

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

    def call(params)
      puts request.path_info      # => "/dashboard"
      puts request.request_method # => "GET"
      puts request.get?           # => true
      puts request.post?          # => false
      puts request.xhr?           # => false
      puts request.referer        # => "http://example.com/"
      puts request.user_agent     # => "Mozilla/5.0 Macintosh; ..."
      puts request.ip             # => "127.0.0.1"
    end
  end
end

Instantiating a request for each incoming HTTP request can lead to minor performance degradation. As an alternative, please consider getting the same information from private action methods like accept? or from the raw Rack environment params.env.

Response

The implicit return value of #call is a serialized Rack::Response (see #finish):

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

    def call(params)
    end
  end
end

# It will return [200, {}, [""]]

It has private accessors to explicitly set status, headers and body:

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

    def call(params)
      self.status = 201
      self.body   = 'Your resource has been created'
      self.headers.merge!({ 'X-Custom' => 'OK' })
    end
  end
end

# It will return [201, { "X-Custom" => "OK" }, ["Your resource has been created"]]

As shortcut we can use #status.

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

    def call(params)
      status 201, "Your resource has been created"
    end
  end
end

# It will return [201, {}, ["Your resource has been created"]]

Looking for Lotus? We renamed the project and it's now called Hanami. Read the announcement.