Novo em Ruby e ROR e amando isso a cada dia, então aqui está minha pergunta, já que não tenho ideia de como pesquisar no Google (e tentei :))
nós temos método
def foo(first_name, last_name, age, sex, is_plumber)
# some code
# error happens here
logger.error "Method has failed, here are all method arguments #{SOMETHING}"
end
Portanto, o que estou procurando é uma maneira de obter todos os argumentos passados para o método, sem listar cada um. Como se trata de Ruby, presumo que haja uma maneira :) se fosse java, eu apenas os listaria :)
A saída seria:
Method has failed, here are all method arguments {"Mario", "Super", 40, true, true}
ruby-on-rails
ruby
Haris Krajina
fonte
fonte
method(__method__).parameters.map { |_, v| [v, binding.local_variable_get(v)] }
Respostas:
No Ruby 1.9.2 e posterior, você pode usar o
parameters
método em um método para obter a lista de parâmetros para aquele método. Isso retornará uma lista de pares indicando o nome do parâmetro e se ele é obrigatório.por exemplo
Se você fizer
então
Você pode usar a variável especial
__method__
para obter o nome do método atual. Portanto, dentro de um método, os nomes de seus parâmetros podem ser obtidos viaVocê pode então exibir o nome e o valor de cada parâmetro com
Nota: uma vez que esta resposta foi escrita originalmente, nas versões atuais do Ruby
eval
não pode mais ser chamada com um símbolo. Para resolver isso, um explícitoto_s
foi adicionado ao construir a lista de nomes de parâmetros, ou seja,parameters.map { |arg| arg[1].to_s }
fonte
Desde o Ruby 2.1, você pode usar binding.local_variable_get para ler o valor de qualquer variável local, incluindo parâmetros de método (argumentos). Graças a isso, você pode melhorar a resposta aceita para evitar
maleval.fonte
Hash[method(__method__).parameters.map.collect { |_, name| [name, binding.local_variable_get(name)] }]
Uma maneira de lidar com isso é:
fonte
Esta é uma pergunta interessante. Talvez usando local_variables ? Mas deve haver uma maneira diferente de usar eval. Estou procurando no documento do kernel
fonte
eval var.to_s
. Além disso, uma advertência é que, se você definir quaisquer variáveis locais antes de executar este loop, elas serão incluídas além dos parâmetros do método.local_variables
, ele retornará os argumentos do método + todas as variáveis locais. Isso pode causar erros quando seu código.Isso pode ser útil ...
fonte
callers_name
implementação ligeiramente hackeada , você também pode passar__method__
adiante obinding
.Você pode definir uma constante como:
E use-o em seu código como:
fonte
Antes de prosseguir, você está passando muitos argumentos para foo. Parece que todos esses argumentos são atributos de um modelo, correto? Você realmente deveria estar passando o próprio objeto. Fim do discurso.
Você pode usar um argumento "splat". Ele coloca tudo em uma série. Seria parecido com:
fonte
Se você quiser alterar a assinatura do método, poderá fazer algo assim:
Ou:
Neste caso, interpolado
args
ouopts.values
será uma matriz, mas você podejoin
se na vírgula. Felicidadesfonte
Parece que o que essa pergunta está tentando fazer poderia ser feito com uma joia que acabei de lançar, https://github.com/ericbeland/exception_details . Ele irá listar variáveis locais e valores (e variáveis de instância) de exceções resgatadas. Pode valer a pena dar uma olhada...
fonte
better_errors
gem.Se você precisar de argumentos como um Hash e não quiser poluir o corpo do método com extração complicada de parâmetros, use isto:
Basta adicionar esta classe ao seu projeto:
fonte
Se a função estiver dentro de alguma classe, você pode fazer algo assim:
fonte