class Hanami::Action::Params

A set of params requested by the client

It's able to extract the relevant params from a Rack env of from an Hash.

There are three scenarios:

* When used with Hanami::Router: it contains only the params from the request
* When used standalone: it contains all the Rack env
* Default: it returns the given hash as it is. It's useful for testing purposes.

@since 0.1.0

Attributes

errors[R]

Returns structured error messages

@return [Hash]

@since 0.7.0

@example

params.errors
  # => {:email=>["is missing", "is in invalid format"], :name=>["is missing"], :tos=>["is missing"], :age=>["is missing"], :address=>["is missing"]}

Public Class Methods

_base_rules() click to toggle source

This is a Hanami::Validations extension point

@since 0.7.0 @api private

# File lib/hanami/action/params.rb, line 117
def self._base_rules
  lambda do
    optional(:_csrf_token).filled(:str?)
  end
end
new(env) click to toggle source

Initialize the params and freeze them.

@param env [Hash] a Rack env or an hash of params.

@return [Params]

@since 0.1.0 @api private

Calls superclass method Hanami::Action::BaseParams::new
# File lib/hanami/action/params.rb, line 163
def initialize(env)
  @env = env
  super(_extract_params)
  @result = validate
  @params = _params
  @errors = Errors.new(@result.messages)
  freeze
end
params(&blk) click to toggle source

Define params validations

@param blk [Proc] the validations definitions

@since 0.7.0

@see guides.hanamirb.org/validations/overview

@example

class Signup
  MEGABYTE = 1024 ** 2
  include Hanami::Action

  params do
    required(:first_name).filled(:str?)
    required(:last_name).filled(:str?)
    required(:email).filled?(:str?, format?: /\A.+@.+\z/)
    required(:password).filled(:str?).confirmation
    required(:terms_of_service).filled(:bool?)
    required(:age).filled(:int?, included_in?: 18..99)
    optional(:avatar).filled(size?: 1..(MEGABYTE * 3))
  end

  def call(params)
    halt 400 unless params.valid?
    # ...
  end
end
# File lib/hanami/action/params.rb, line 151
def self.params(&blk)
  validations(&blk || ->() {})
end

Public Instance Methods

error_messages(error_set = errors) click to toggle source

Returns flat collection of full error messages

@return [Array]

@since 0.7.0

@example

params.error_messages
  # => ["Email is missing", "Email is in invalid format", "Name is missing", "Tos is missing", "Age is missing", "Address is missing"]
# File lib/hanami/action/params.rb, line 201
def error_messages(error_set = errors)
  error_set.each_with_object([]) do |(key, messages), result|
    k = Utils::String.titleize(key)

    _messages = if messages.is_a?(Hash)
      error_messages(messages)
    else
      messages.map { |message| "#{k} #{message}" }
    end

    result.concat(_messages)
  end
end
raw() click to toggle source

Returns raw params from Rack env

@return [Hash]

@since 0.3.2

# File lib/hanami/action/params.rb, line 177
def raw
  @input
end
to_h() click to toggle source

Serialize params to Hash

@return [::Hash]

@since 0.3.0

# File lib/hanami/action/params.rb, line 233
def to_h
  @params
end
Also aliased as: to_hash
to_hash()
Alias for: to_h
valid?() click to toggle source

Returns true if no validation errors are found, false otherwise.

@return [TrueClass, FalseClass]

@since 0.7.0

@example

params.valid? # => true
# File lib/hanami/action/params.rb, line 224
def valid?
  errors.empty?
end

Private Instance Methods

_params() click to toggle source

@api private

# File lib/hanami/action/params.rb, line 241
def _params
  _router_params.merge(@result.output)
end