如何将Ruby类名转换为下划线符号?

我如何以编程方式将类名称FooBar转换为符号:foo_bar ? 例如这样的事情,但是正确处理骆驼案件?

 FooBar.to_s.downcase.to_sym 

Rails带有一个叫做underscore的方法,可以让你把CamelCasedstring转换成下划线的string。 所以你可以这样做:

 FooBar.name.underscore.to_sym 

但是你必须安装ActiveSupport才行,就像ipsum所说的那样。

如果您不想仅为此安装ActiveSupport,则可以自己将下划线underscoreString (下划线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