Class: Rack::Action

Inherits:
Object
  • Object
show all
Extended by:
Filters
Defined in:
lib/rack/action.rb

Constant Summary collapse

VERSION =
"0.7.0".freeze

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(env) ⇒ Action

Returns a new instance of Action.



39
40
41
# File 'lib/rack/action.rb', line 39

def initialize(env)
  @env = env
end

Class Attribute Details

.json_serializerObject



229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/rack/action.rb', line 229

def json_serializer
  if defined? @json_serializer
    @json_serializer
  else
    @json_serializer =
      if superclass.respond_to?(:json_serializer)
        superclass.json_serializer
      else
        JSON
      end
  end
end

.loggerObject



221
222
223
224
225
226
227
# File 'lib/rack/action.rb', line 221

def logger
  if defined? @logger
    @logger
  else
    @logger = superclass.logger if superclass.respond_to?(:logger)
  end
end

Instance Attribute Details

#envObject

Returns the value of attribute env.



36
37
38
# File 'lib/rack/action.rb', line 36

def env
  @env
end

#paramsObject



51
52
53
54
55
56
57
58
59
60
61
# File 'lib/rack/action.rb', line 51

def params
  @params ||= begin
    p = request.params.merge(env[RACK_ROUTE_PARAMS] || {})
    if request.content_type.to_s.include?(APPLICATION_JSON)
      body = env[RACK_INPUT].read
      env[RACK_INPUT].rewind
      p.merge!(self.class.json_serializer.load(body)) if body.present?
    end
    p.respond_to?(:with_indifferent_access) ? p.with_indifferent_access : p
  end
end

#requestObject



43
44
45
# File 'lib/rack/action.rb', line 43

def request
  @request ||= Rack::Request.new(env)
end

#responseObject



47
48
49
# File 'lib/rack/action.rb', line 47

def response
  @response ||= Rack::Response.new
end

Class Method Details

.call(env) ⇒ Array<Numeric, Hash, #each>

This implements the Rack interface

Parameters:

  • env (Hash)

    The Rack environment

Returns:

  • (Array<Numeric, Hash, #each>)

    A Rack response



32
33
34
# File 'lib/rack/action.rb', line 32

def self.call(env)
  new(env).call
end

Instance Method Details

#absolute_url(url, options = {}) ⇒ String

Generate an absolute url from the url. If the url is already an absolute url, this will return it unchanged.

Parameters:

  • url (String)

    The URL

  • options (Hash) (defaults to: {})

    The options to use to generate the absolute URL

Options Hash (options):

  • :https (true, false)

    If https should be used, uses rack.url_scheme from the Rack env to determine the default

  • :host (String)

    The host to use, uses SERVER_NAME form the Rack env for the default

  • :port (String, Numeric)

    The port to use, users SERVER_PORT from the Rack env for the default

Returns:

  • (String)

    The absolute url



159
160
161
# File 'lib/rack/action.rb', line 159

def absolute_url(url, options={})
  URL.new(env, url, options).to_absolute
end

#callArray<Numeric, Hash, #each>

This is the main method responsible for generating a Rack response. You typically won’t need to override this method or call it directly. First this will run the before filters for this action. If none of the before filters generate a response, this will call #respond to generate a response. All after filters for this action are called once the response is genenated. Finally the response is returned.

Returns:

  • (Array<Numeric, Hash, #each>)

    A Rack response



82
83
84
85
86
87
88
89
# File 'lib/rack/action.rb', line 82

def call
  log_call
  set_default_headers
  run_before_filters
  run_respond
  run_after_filters
  finish_response
end

#forbiddenObject

Convenience method to return a 403



133
134
135
# File 'lib/rack/action.rb', line 133

def forbidden
  respond_with 403
end

#formatObject



63
64
65
66
67
68
69
70
71
# File 'lib/rack/action.rb', line 63

def format
  if params[:format]
    params[:format]
  elsif env[HTTP_ACCEPT] == APPLICATION_JSON
    "json"
  else
    "html"
  end
end

#json(data = {}, options = {}) ⇒ String

This is a convenience method that sets the Content-Type headers and writes the JSON String to the response.

Parameters:

  • data (Hash) (defaults to: {})

    The data

  • options (Hash) (defaults to: {})

    The options

Options Hash (options):

  • :status (Fixnum)

    The response status code

Returns:

  • (String)

    The JSON



108
109
110
111
112
# File 'lib/rack/action.rb', line 108

def json(data={}, options={})
  response[CONTENT_TYPE] = APPLICATION_JSON
  response.status = options[:status] if options.has_key?(:status)
  response.write self.class.json_serializer.dump(data)
end

#not_foundObject

Convenience method to return a 404



128
129
130
# File 'lib/rack/action.rb', line 128

def not_found
  respond_with 404
end

#redirect_to(url, options = {}) ⇒ String

This is a convenience method that forms an absolute URL based on the url parameter, which can be a relative or absolute URL, and then sets the headers and the body appropriately to do a 302 redirect.

Returns:

  • (String)

    The absolute url

See Also:



120
121
122
123
124
125
# File 'lib/rack/action.rb', line 120

def redirect_to(url, options={})
  full_url = absolute_url(url, options)
  response[LOCATION] = full_url
  respond_with 302
  full_url
end

#respondString

This is the main method that you should override in your action. You can either write to the response during this method, or simply return a string, which will be written to the response if the response is still empty after this is called.

Returns:

  • (String)

    The Rack response or a String



97
98
99
# File 'lib/rack/action.rb', line 97

def respond
  DEFAULT_RESPONSE
end

#respond_with(status_code) ⇒ Object

This is a convenience method to set the response code and set the response so that it stops respond process.

Parameters:

  • status_code (Fixnum)

    The HTTP status code to use in the response



141
142
143
144
145
# File 'lib/rack/action.rb', line 141

def respond_with(status_code)
  response.status = status_code
  response.write ""
  nil
end