Validando parâmetros de hash em ruby

Se comparar muitos argumentos com o hash de “opções”, geralmente escolho o hash de opções. E frequentemente encontro problemas quando passo o nome da chave errado ou o que não é compatível.

ActiveSupportjá tem Hash # para declarar chaves válidas , adicionei mais um método assert_required_keys:

class Hash
def assert_required_keys(*keys)
keys
.flatten.each do |key|
raise
ArgumentError.new("Required key: #{key.inspect}") unless has_key?(key)
end
end
end

Aqui está minha solução para validar chaves hash:

module ValidateOptions
def validate_options!(params, options)
options
[:optional] ||= []
options
[:required] ||= []

params
= params.deep_symbolize_keys
params
.assert_required_keys(options[:required])
params
.assert_valid_keys(options[:required] + options[:optional])
end
end

Exemplo de uso:

include ValidateOptions

def method_with_options(options = {})
validate_options
!(options,
required
: [:order_id, :subject, :from, :to, :text_body, :html_body],
optional
: [:cc, :bcc, :template_name]
)
end