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.
ActiveSupport
já 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