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

时间:2011-04-11 14:03:22

标签: ruby-on-rails ruby metaprogramming

如何以编程方式将类名FooBar转换为符号:foo_bar?例如像这样的东西,但正确处理骆驼的情况?

FooBar.to_s.downcase.to_sym

4 个答案:

答案 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"

所以你应该使用其中一个,如果它们符合你想要的含义,很可能就是这种情况。优点:

  • 更容易理解您的代码
  • 即使在Rails决定更改命名约定的(不太可能的)事件中,您的应用仍然可以正常工作。
BTW,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