¿Cómo puedo convertir programáticamente el nombre de una clase FooBar
, en un símbolo :foo_bar
,? por ejemplo, algo como esto, pero que maneja correctamente el caso camel?
FooBar.to_s.downcase.to_sym
¿Cómo puedo convertir programáticamente el nombre de una clase FooBar
, en un símbolo :foo_bar
,? por ejemplo, algo como esto, pero que maneja correctamente el caso camel?
FooBar.to_s.downcase.to_sym
Respuestas:
Rails viene con un método llamado underscore
que le permitirá transformar cadenas CamelCased en cadenas undercore_separated. Entonces, es posible que pueda hacer esto:
FooBar.name.underscore.to_sym
Pero tendrá que instalar ActiveSupport solo para hacer eso, como dice ipsum.
Si no desea instalar ActiveSupport solo para eso, puede parchear underscore
en String
usted mismo (la función de subrayado se define en ActiveSupport :: Inflector ):
class String
def underscore
word = self.dup
word.gsub!(/::/, '/')
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
word.tr!("-", "_")
word.downcase!
word
end
end
Carriles 4 .model_name
En Rails 4, devuelve un ActiveModel::Name
objeto que contiene muchos atributos más "semánticos" útiles como:
FooBar.model_name.param_key
#=> "foo_bar"
FooBar.model_name.route_key
#=> "foo_bars"
FooBar.model_name.human
#=> "Foo bar"
Por lo tanto, debe usar uno de esos si coinciden con el significado deseado, que es probablemente el caso. Ventajas:
Por cierto, human
tiene la ventaja de ser consciente de I18N.
model_name
también funciona, por ejemplo, objetos. Ej foo_bar.model_name
. : . Si desea la lista completa, escriba foo_bar.model_name.inspect
en la consola de rieles o en su depurador
classify
, modelize
no parece funcionar.
primero: gema instalar activesupport
require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym
FooBar.to_s.underscore.to_sym
, ya que estoy tratando de convertir una clase (que es una constante) en un símbolo, que luego puedo alimentar a Factory Girl . :)
Esto es lo que busqué:
module MyModule
module ClassMethods
def class_to_sym
name_without_namespace = name.split("::").last
name_without_namespace.gsub(/([^\^])([A-Z])/,'\1_\2').downcase.to_sym
end
end
def self.included(base)
base.extend(ClassMethods)
end
end
class ThisIsMyClass
include MyModule
end
ThisIsMyClass.class_to_sym #:this_is_my_class
String#demodulize
que eliminará la pieza anterior ::
.