¿Cómo obtengo el nombre de una clase Ruby?
¿Cómo puedo obtener el nombre de la clase de un objeto ActiveRecord?
Tengo:
result = User.find(1)
Lo intenté:
result.class
# => User(id: integer, name: string ...)
result.to_s
# => #<User:0x3d07cdc>"
Solo necesito el nombre de la clase, en una cadena (User
en este caso). ¿Hay algún método para eso?
Sé que esto es bastante básico, pero busqué los documentos de Rails y Ruby, y no pude encontrarlo.
5 answers
Desea llamar a . name en la clase del objeto:
result.class.name
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-05 18:21:23
Aquí está la respuesta correcta, extraída de los comentarios de Daniel Rikowski y pseidemann. Estoy cansado de tener que limpiar los comentarios para encontrar la respuesta correcta...
Si utiliza Rails (ActiveSupport):
result.class.name.demodulize
Si usas POR (plain-ol-Ruby):
result.class.name.split('::').last
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-18 19:21:09
Ambos result.class.to_s
y result.class.name
funcionan.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-12 05:45:26
Si desea obtener un nombre de clase desde dentro de un método de clase, class.name
o self.class.name
no funcionará. Estos solo producirán Class
, ya que la clase de una clase es Class
. En su lugar, puedes usar name
:
module Foo
class Bar
def self.say_name
puts "I'm a #{name}!"
end
end
end
Foo::Bar.say_name
Salida:
I'm a Foo::Bar!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 20:01:45
En mi caso cuando uso algo como result.class.name
tengo algo como Module1::class_name
. Pero si solo queremos class_name
, usar
result.table_name.singularize
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-06 06:39:13