Class: Hanami::Action Private
- Inherits:
-
Object
- Object
- Hanami::Action
- Defined in:
- lib/hanami/action.rb,
lib/hanami/action/halt.rb,
lib/hanami/action/mime.rb,
lib/hanami/action/cache.rb,
lib/hanami/action/flash.rb,
lib/hanami/action/config.rb,
lib/hanami/action/errors.rb,
lib/hanami/action/params.rb,
lib/hanami/action/cookies.rb,
lib/hanami/action/request.rb,
lib/hanami/action/session.rb,
lib/hanami/action/response.rb,
lib/hanami/action/constants.rb,
lib/hanami/action/rack/file.rb,
lib/hanami/action/cookie_jar.rb,
lib/hanami/action/validatable.rb,
lib/hanami/action/cache/expires.rb,
lib/hanami/action/config/formats.rb,
lib/hanami/action/csrf_protection.rb,
lib/hanami/action/cache/directives.rb,
lib/hanami/action/view_name_inferrer.rb,
lib/hanami/action/cache/cache_control.rb,
lib/hanami/action/cache/conditional_get.rb,
lib/hanami/action/mime/request_mime_weight.rb
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Defined Under Namespace
Modules: CSRFProtection, Cache, Cookies, Halt, Mime, Rack, Session, Validatable Classes: Config, CookieJar, Error, Flash, InvalidCSRFTokenError, MissingSessionError, Params, Request, Response, UnknownFormatError, UnknownHttpStatusError, ViewNameInferrer
Constant Summary collapse
- RESPONSE_CODE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Rack SPEC response code
0
- RESPONSE_HEADERS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Rack SPEC response headers
1
- RESPONSE_BODY =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Rack SPEC response body
2
- DEFAULT_ERROR_CODE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
500
- HTTP_STATUSES_WITHOUT_BODY =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Status codes that by RFC must not include a message body
Set.new((100..199).to_a << 204 << 205 << 304).freeze
- NOT_FOUND =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Not Found
404
- ENTITY_HEADERS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Entity headers allowed in blank body responses, according to RFC 2616 - Section 10 (HTTP 1.1).
“The response MAY include new or updated metainformation in the form
of entity-headers".
{ "Allow" => true, "Content-Encoding" => true, "Content-Language" => true, "Content-Location" => true, "Content-MD5" => true, "Content-Range" => true, "Expires" => true, "Last-Modified" => true, "extension-header" => true }.freeze
- PATH_INFO =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The request relative path
::Rack::PATH_INFO
- REQUEST_METHOD =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The request method
::Rack::REQUEST_METHOD
- CONTENT_LENGTH =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The Content-Length HTTP header
::Rack::CONTENT_LENGTH
- X_CASCADE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The non-standard HTTP header to pass the control over when a resource cannot be found by the current endpoint
"X-Cascade"
- HEAD =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
HEAD request
::Rack::HEAD
- GET =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
GET request
::Rack::GET
- TRACE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
TRACE request
::Rack::TRACE
- OPTIONS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
OPTIONS request
::Rack::OPTIONS
- HTTP_ACCEPT =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The key that returns accepted mime types from the Rack env
"HTTP_ACCEPT"
- DEFAULT_ACCEPT =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The default mime type for an incoming HTTP request
"*/*"
- DEFAULT_CONTENT_TYPE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The default mime type that is returned in the response
"application/octet-stream"
- RACK_ERRORS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
::Rack::RACK_ERRORS
- CACHE_CONTROL =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The HTTP header for Cache-Control
::Rack::CACHE_CONTROL
- IF_NONE_MATCH =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
"HTTP_IF_NONE_MATCH"
- ETAG =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The HTTP header for ETag
::Rack::ETAG
- IF_MODIFIED_SINCE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
"HTTP_IF_MODIFIED_SINCE"
- EXPIRES =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The HTTP header for Expires
::Rack::EXPIRES
- LAST_MODIFIED =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The HTTP header for Last-Modified
"Last-Modified"
- RACK_EXCEPTION =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
This isn’t part of Rack SPEC
Exception notifiers use
rack.exception
instead ofrack.errors
, so we need to support it. "rack.exception"
- LOCATION =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The HTTP header for redirects
"Location"
- RACK_SESSION =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The key that returns Rack session params from the Rack env Please note that this is used only when an action is unit tested.
::Rack::RACK_SESSION
- REQUEST_ID =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
"hanami.request_id"
- DEFAULT_ID_LENGTH =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
16
- HTTP_COOKIE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The key that returns raw cookies from the Rack env
::Rack::HTTP_COOKIE
- COOKIE_HASH_KEY =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The key used by Rack to set the cookies as an Hash in the env
::Rack::RACK_REQUEST_COOKIE_HASH
- COOKIE_STRING_KEY =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The key used by Rack to set the cookies as a String in the env
::Rack::RACK_REQUEST_COOKIE_STRING
- RACK_INPUT =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The key that returns raw input from the Rack env
::Rack::RACK_INPUT
- ROUTER_PARAMS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The key that returns router params from the Rack env This is a builtin integration for Hanami::Router
"router.params"
- DEFAULT_REQUEST_METHOD =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Default HTTP request method for Rack env
GET
- DEFAULT_CHARSET =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
"utf-8"
- ACTION_INSTANCE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
"hanami.action_instance"
Class Method Summary collapse
-
.self.append_after(*callbacks, &block) ⇒ void
(also: after)
Define a callback for an Action.
-
.self.append_before(*callbacks, &block) ⇒ void
(also: before)
Define a callback for an Action.
-
.config ⇒ Config
Returns the action’s config.
-
.contract ⇒ Object
Placeholder for the ‘.contract` method.
- .format ⇒ Object
- .gem_loader ⇒ Object private
- .handle_exception ⇒ Object
-
.inherited(subclass) ⇒ Object
private
Override Ruby’s hook for modules.
-
.params(_klass = nil) ⇒ Object
Placeholder for the ‘.params` method.
-
.self.prepend_after(*callbacks, &block) ⇒ void
Define a callback for an Action.
-
.self.prepend_before(*callbacks, &block) ⇒ void
Define a callback for an Action.
Instance Method Summary collapse
-
#call(env) ⇒ Object
private
Implements the Rack/Hanami::Action protocol.
-
#initialize(config: self.class.config, contract: nil) ⇒ Action
constructor
Returns a new action.
Constructor Details
#initialize(config: self.class.config, contract: nil) ⇒ Action
Returns a new action
296 297 298 299 300 |
# File 'lib/hanami/action.rb', line 296 def initialize(config: self.class.config, contract: nil) @config = config @contract = contract || config.contract_class&.new # TODO: tests showing this overridden by a dep freeze end |
Class Method Details
.self.append_after(*callbacks, &block) ⇒ void Also known as: after
219 220 221 |
# File 'lib/hanami/action.rb', line 219 def self.append_after(...) config.after_callbacks.append(...) end |
.self.append_before(*callbacks, &block) ⇒ void Also known as: before
194 195 196 |
# File 'lib/hanami/action.rb', line 194 def self.append_before(...) config.before_callbacks.append(...) end |
.config ⇒ Config
Returns the action’s config. Use this to configure your action.
|
# File 'lib/hanami/action.rb', line 79
|
.contract ⇒ Object
Placeholder for the ‘.contract` method. Raises an error when the hanami-validations gem is not installed.
130 131 132 133 |
# File 'lib/hanami/action.rb', line 130 def self.contract = %(To use `.contract`, please add the "hanami-validations" gem to your Gemfile) raise NoMethodError, end |
.format ⇒ Object
272 273 274 |
# File 'lib/hanami/action.rb', line 272 def self.format(...) config.format(...) end |
.gem_loader ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/hanami/action.rb', line 33 def self.gem_loader @gem_loader ||= Zeitwerk::Loader.new.tap do |loader| root = File.("..", __dir__) loader.tag = "hanami-controller" loader.inflector = Zeitwerk::GemInflector.new("#{root}/hanami-controller.rb") loader.push_dir(root) loader.ignore( "#{root}/hanami-controller.rb", "#{root}/hanami/controller/version.rb", "#{root}/hanami/action/{constants,errors,validatable}.rb" ) loader.inflector.inflect("csrf_protection" => "CSRFProtection") end end |
.handle_exception ⇒ Object
280 281 282 |
# File 'lib/hanami/action.rb', line 280 def self.handle_exception(...) config.handle_exception(...) end |
.inherited(subclass) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Override Ruby’s hook for modules. It includes basic Hanami::Action modules to the given class.
101 102 103 104 105 106 107 108 109 |
# File 'lib/hanami/action.rb', line 101 def self.inherited(subclass) super if subclass.superclass == Action subclass.class_eval do include Validatable if defined?(Validatable) end end end |
.params(_klass = nil) ⇒ Object
Placeholder for the ‘.params` method. Raises an error when the hanami-validations gem is not installed.
118 119 120 121 |
# File 'lib/hanami/action.rb', line 118 def self.params(_klass = nil) = %(To use `.params`, please add the "hanami-validations" gem to your Gemfile) raise NoMethodError, end |
.self.prepend_after(*callbacks, &block) ⇒ void
264 265 266 |
# File 'lib/hanami/action.rb', line 264 def self.prepend_after(...) config.after_callbacks.prepend(...) end |
.self.prepend_before(*callbacks, &block) ⇒ void
244 245 246 |
# File 'lib/hanami/action.rb', line 244 def self.prepend_before(...) config.before_callbacks.prepend(...) end |
Instance Method Details
#call(env) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Implements the Rack/Hanami::Action protocol
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 |
# File 'lib/hanami/action.rb', line 306 def call(env) request = nil response = nil halted = catch :halt do params = Params.new(env: env, contract: contract) request = build_request( env: env, params: params, session_enabled: session_enabled? ) response = build_response( request: request, config: config, content_type: Mime.response_content_type_with_charset(request, config), env: env, headers: config.default_headers, session_enabled: session_enabled? ) enforce_accepted_mime_types(request) _run_before_callbacks(request, response) handle(request, response) _run_after_callbacks(request, response) rescue StandardError => exception _handle_exception(request, response, exception) end # Before finishing, put ourself into the Rack env for third-party instrumentation tools to # integrate with actions env[ACTION_INSTANCE] = self finish(request, response, halted) end |