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

Jos*_*ver 90 ruby metaprogramming ruby-on-rails

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

FooBar.to_s.downcase.to_sym
Run Code Online (Sandbox Code Playgroud)

kik*_*ito 138

Rails附带了一个名为的方法underscore,允许您将CamelCased字符串转换为underscore_separated字符串.所以你可以这样做:

FooBar.name.underscore.to_sym
Run Code Online (Sandbox Code Playgroud)

但正如ipsum所说,你必须安装ActiveSupport才能做到这一点.

如果你不想安装的ActiveSupport只是,你就可以猴子补丁underscoreString自己(下划线函数中定义的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
Run Code Online (Sandbox Code Playgroud)

  • 不,不是ActiveRecord.的ActiveSupport. (5认同)
  • 然后你应该相应地标记你的问题.在这里,让我为你做... (2认同)
  • 反过来怎么办? (2认同)

Cir*_*四事件 69

.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"
Run Code Online (Sandbox Code Playgroud)

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

  • 更容易理解您的代码
  • 即使在Rails决定更改命名约定的(不太可能的)事件中,您的应用仍然可以工作.

BTW,human具有I18N意识的优势.


ips*_*sum 7

第一:gem install activesupport

require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym
Run Code Online (Sandbox Code Playgroud)