Nuevo en Ruby y ROR y me encanta cada día, así que aquí está mi pregunta ya que no tengo idea de cómo buscarlo en Google (y lo he intentado :))
tenemos 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
Entonces, lo que estoy buscando es la forma de pasar todos los argumentos al método, sin enumerar cada uno. Como esto es Ruby, supongo que hay una manera :) si fuera Java, simplemente los enumeraría :)
La salida sería:
Method has failed, here are all method arguments {"Mario", "Super", 40, true, true}
ruby-on-rails
ruby
Haris Krajina
fuente
fuente
method(__method__).parameters.map { |_, v| [v, binding.local_variable_get(v)] }
Respuestas:
En Ruby 1.9.2 y versiones posteriores, puede usar el
parameters
método en un método para obtener la lista de parámetros para ese método. Esto devolverá una lista de pares indicando el nombre del parámetro y si es necesario.p.ej
Si lo haces
luego
Puede utilizar la variable especial
__method__
para obtener el nombre del método actual. Entonces, dentro de un método, los nombres de sus parámetros se pueden obtener a través deA continuación, puede mostrar el nombre y el valor de cada parámetro con
Nota: dado que esta respuesta se escribió originalmente, en las versiones actuales de Ruby
eval
ya no se puede llamar con un símbolo. Para abordar esto, seto_s
ha agregado un explícito al construir la lista de nombres de parámetros, es decirparameters.map { |arg| arg[1].to_s }
fuente
Desde Ruby 2.1, puede usar binding.local_variable_get para leer el valor de cualquier variable local, incluidos los parámetros del método (argumentos). Gracias a eso puedes mejorar la respuesta aceptada para evitar
maleval.fuente
Hash[method(__method__).parameters.map.collect { |_, name| [name, binding.local_variable_get(name)] }]
Una forma de manejar esto es:
fuente
Esta es una pregunta interesante. ¿Quizás usando local_variables ? Pero debe haber una forma distinta de usar eval. Estoy buscando en Kernel doc
fuente
eval var.to_s
. Además, una advertencia a esto es que si define cualquier variable local antes de ejecutar este ciclo, se incluirá además de los parámetros del método.local_variables
, devolverá los argumentos del método + todas las variables locales. Esto puede provocar errores cuando su código.Esto puede ser útil ...
fuente
callers_name
implementación ligeramente pirateada , también podría pasar__method__
junto con elbinding
.Puede definir una constante como:
Y utilícelo en su código como:
fuente
Antes de continuar, estás pasando demasiados argumentos a foo. Parece que todos esos argumentos son atributos de un modelo, ¿correcto? Realmente debería pasar el objeto en sí. Fin del discurso.
Podría utilizar un argumento "splat". Empuja todo en una matriz. Se vería así:
fuente
Si cambia la firma del método, puede hacer algo como esto:
O:
En este caso, interpolado
args
oopts.values
será una matriz, pero puedejoin
hacerlo si está en coma. Saludfuente
Parece que lo que esta pregunta está tratando de lograr podría hacerse con una gema que acabo de lanzar, https://github.com/ericbeland/exception_details . Enumerará las variables y valores locales (y las variables de instancia) de las excepciones rescatadas. Vale la pena echarle un vistazo ...
fuente
better_errors
gem.Si necesita argumentos como Hash y no desea contaminar el cuerpo del método con una extracción complicada de parámetros, use esto:
Simplemente agregue esta clase a su proyecto:
fuente
Si la función está dentro de alguna clase, puede hacer algo como esto:
fuente