Class: Hanami::Action::Params

Inherits:
BaseParams show all
Includes:
Validations::Form
Defined in:
lib/hanami/action/params.rb

Overview

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

Defined Under Namespace

Classes: Errors

Constant Summary

Constants inherited from BaseParams

BaseParams::DEFAULT_REQUEST_METHOD, BaseParams::RACK_INPUT, BaseParams::RACK_SESSION, BaseParams::REQUEST_METHOD, BaseParams::ROUTER_PARAMS

Instance Attribute Summary collapse

Attributes inherited from BaseParams

#env

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from BaseParams

#[], #each, #get

Constructor Details

#initialize(env) ⇒ Params

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.

Initialize the params and freeze them.

Parameters:

  • env (Hash)

    a Rack env or an hash of params.

Since:

  • 0.1.0



163
164
165
166
167
168
169
170
# 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

Instance Attribute Details

#errorsHash (readonly)

Returns structured error messages

Examples:

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

Returns:

  • (Hash)

Since:

  • 0.7.0



190
191
192
# File 'lib/hanami/action/params.rb', line 190

def errors
  @errors
end

Class Method Details

._base_rulesObject

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.

This is a Hanami::Validations extension point

Since:

  • 0.7.0



117
118
119
120
121
# File 'lib/hanami/action/params.rb', line 117

def self._base_rules
  lambda do
    optional(:_csrf_token).filled(:str?)
  end
end

.params(&blk) ⇒ Object

Define params validations

Examples:

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

Parameters:

  • blk (Proc)

    the validations definitions

See Also:

Since:

  • 0.7.0



151
152
153
# File 'lib/hanami/action/params.rb', line 151

def self.params(&blk)
  validations(&blk || ->() {})
end

Instance Method Details

#error_messages(error_set = errors) ⇒ Array

Returns flat collection of full error messages

Examples:

params.error_messages
  # => ["Email is missing", "Email is in invalid format", "Name is missing", "Tos is missing", "Age is missing", "Address is missing"]

Returns:

  • (Array)

Since:

  • 0.7.0



201
202
203
204
205
206
207
208
209
210
211
212
213
# 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

#rawHash

Returns raw params from Rack env

Returns:

  • (Hash)

Since:

  • 0.3.2



177
178
179
# File 'lib/hanami/action/params.rb', line 177

def raw
  @input
end

#to_h::Hash Also known as: to_hash

Serialize params to Hash

Returns:

  • (::Hash)

Since:

  • 0.3.0



233
234
235
# File 'lib/hanami/action/params.rb', line 233

def to_h
  @params
end

#valid?TrueClass, FalseClass

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

Examples:

params.valid? # => true

Returns:

  • (TrueClass, FalseClass)

Since:

  • 0.7.0



224
225
226
# File 'lib/hanami/action/params.rb', line 224

def valid?
  errors.empty?
end