如何以编程方式将类名称FooBar
转换为符号:foo_bar
?例如这样的东西,但是可以正确处理骆驼的情况?
FooBar.to_s.downcase.to_sym
如何以编程方式将类名称FooBar
转换为符号:foo_bar
?例如这样的东西,但是可以正确处理骆驼的情况?
FooBar.to_s.downcase.to_sym
Answers:
Rails带有一种称为的方法,该方法underscore
将允许您将CamelCased字符串转换为underscore_separated字符串。因此,您可以执行以下操作:
FooBar.name.underscore.to_sym
但是您必须安装ActiveSupport才能做到这一点,如ipsum所说。
如果你不想安装的ActiveSupport只是,你就可以猴子补丁underscore
到String
自己(下划线函数中定义的ActiveSupport ::变形器):
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
滑轨4 .model_name
在Rails 4中,它返回一个ActiveModel::Name
对象,其中包含许多有用的“语义”属性,例如:
FooBar.model_name.param_key
#=> "foo_bar"
FooBar.model_name.route_key
#=> "foo_bars"
FooBar.model_name.human
#=> "Foo bar"
因此,如果它们符合您的期望含义,则应使用其中一种,这很可能是这种情况。优点:
顺便说一句,human
具有I18N意识的优势。
model_name
也适用于实例对象。例如:foo_bar.model_name
。如果您想foo_bar.model_name.inspect
在Rails控制台或调试器中写入完整列表
classify
,modelize
似乎没有工作。
第一:gem install activesupport
require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym
FooBar.to_s.underscore.to_sym
,因为我试图将一个类(一个常量)转换为一个符号,然后可以将其提供给Factory Girl。:)
这是我追求的目标:
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
将删除此部分的功能::
。