Ruby on rails 如何将Ruby类名转换为下划线分隔的符号?

Ruby on rails 如何将Ruby类名转换为下划线分隔的符号?,ruby-on-rails,ruby,metaprogramming,Ruby On Rails,Ruby,Metaprogramming,如何通过编程将类名FooBar转换为符号:foo\u bar?e、 像这样的东西,但能正确处理驼峰案吗 FooBar.to_s.downcase.to_sym 第一:gem安装activesupport require 'rubygems' require 'active_support' "FooBar".underscore.to_sym Rails附带了一个名为下划线的方法,该方法允许您将大小写字符串转换为下划线分隔的字符串。因此,您可以这样做: FooBar.name.undersc

如何通过编程将类名
FooBar
转换为符号
:foo\u bar
?e、 像这样的东西,但能正确处理驼峰案吗

FooBar.to_s.downcase.to_sym

第一:gem安装activesupport

require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym

Rails附带了一个名为
下划线
的方法,该方法允许您将大小写字符串转换为下划线分隔的字符串。因此,您可以这样做:

FooBar.name.underscore.to_sym
但正如ipsum所说,您必须安装ActiveSupport才能做到这一点

如果您不想为此安装ActiveSupport,您可以自己将修补程序
下划线
安装到
字符串
中(下划线函数在中定义):


以下是我想要的:

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

Rails 4
.model\u name

在Rails 4中,它返回一个对象,该对象包含许多更有用的“语义”属性,例如:

FooBar.model_name.param_key
#=> "foo_bar"

FooBar.model_name.route_key
#=> "foo_bars"

FooBar.model_name.human
#=> "Foo bar"
因此,如果它们符合你想要的意思,你应该使用其中一个,很可能就是这样。优点:

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

顺便说一句,
human
具有I18N感知的优势。

谢谢。我担心这是Rails的扩展。:)不用担心,因为我实际上在使用Rails。那么您应该相应地标记您的问题。来,让我来帮你…不,不是ActiveRecord。ActiveSupport.@user1406062为此提出了另一个问题。
plus\u priced\u item
如何给出
plus::PricedItem
(涉及命名空间)?我使用了
'plus::\u prized\u items'
,但感觉很不对,应该是
FooBar.to\s.下划线.to\u sym
,因为我试图将一个类(一个常量)转换成一个符号,然后我可以将其馈送到:)ActiveSupport有
String#demodulize
,它将删除
@amoebe之前的部分-感谢您提供的信息。但这取决于您的工作内容-您可能没有在rails应用程序(甚至web应用程序)上工作。
model\u name
也适用于实例对象。例如:
foo\u bar.model\u name
。如果您想要完整的列表,请在rails控制台或您的调试程序中编写
foo\u bar.model\u name.inspect
,我正在寻找相反的/相反的,
classify
modelize
似乎不起作用。
FooBar.model_name.param_key
#=> "foo_bar"

FooBar.model_name.route_key
#=> "foo_bars"

FooBar.model_name.human
#=> "Foo bar"