如何以编程方式将类名FooBar
转换为符号:foo_bar
?例如像这样的东西,但正确处理骆驼的情况?
FooBar.to_s.downcase.to_sym
答案 0 :(得分:132)
Rails附带了一个名为underscore
的方法,它允许您将CamelCased字符串转换为underscore_separated字符串。所以你可以这样做:
FooBar.name.underscore.to_sym
但正如ipsum所说,你必须安装ActiveSupport才能做到这一点。
如果您不想仅为此安装ActiveSupport,可以自己将underscore
修补为String
(下划线功能在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
答案 1 :(得分:62)
<强> 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意识的优势。
答案 2 :(得分:6)
首先:gem install activesupport
require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym
答案 3 :(得分:2)
这就是我的目的:
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