如何将Ruby类名转换为下划线符号?
我如何以编程方式将类名称FooBar
转换为符号:foo_bar
? 例如这样的事情,但是正确处理骆驼案件?
FooBar.to_s.downcase.to_sym
Rails带有一个叫做underscore
的方法,可以让你把CamelCasedstring转换成下划线的string。 所以你可以这样做:
FooBar.name.underscore.to_sym
但是你必须安装ActiveSupport才行,就像ipsum所说的那样。
如果您不想仅为此安装ActiveSupport,则可以自己将下划线underscore
到String
(下划线function在ActiveSupport :: Inflector中定义):
class String def underscore word = self.dup word.gsub!(/::/, '/') word.gsub!(/([AZ]+)([AZ][az])/,'\1_\2') word.gsub!(/([az\d])([AZ])/,'\1_\2') word.tr!("-", "_") word.downcase! word end end
Rails 4中的model_name返回一个ActiveModel::Name
对象,其中包含许多有用的更多“语义”属性,如:
FooBar.model_name.param_key #=> "foo_bar" FooBar.model_name.route_key #=> "foo_bars" FooBar.model_name.human #=> "Foo bar"
所以你应该使用其中的一个,如果它们符合你想要的意思,情况可能如此。 优点:
- 更容易理解你的代码
- 即使在Rails决定改变命名约定的(不太可能的)事件中,你的应用程序仍然可以工作。
顺便说一下, human
有I18N的优势。
第一:gem安装activesupport
require 'rubygems' require 'active_support' "FooBar".underscore.to_sym
这是我去的:
module MyModule module ClassMethods def class_to_sym name_without_namespace = name.split("::").last name_without_namespace.gsub(/([^\^])([AZ])/,'\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