web-dev-qa-db-ja.com

Rubyクラス名をアンダースコア区切り記号に変換するにはどうすればよいですか?

プログラムでクラス名FooBarをシンボル:foo_barに変換するにはどうすればよいですか?例えばこのようなものですが、それはラクダのケースを適切に処理しますか?

FooBar.to_s.downcase.to_sym
88
Josh Glover

Railsには、CamelCased文字列をunderscore_separated文字列に変換できるunderscoreというメソッドが付属しています。だからあなたはこれを行うことができるかもしれません:

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
134
kikito

レール4 .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が命名規則を変更することを決定した場合)の場合でも、アプリは引き続き動作します。

ところで、humanにはI18Nを認識するという利点があります。

最初:gem install activesupport

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

私が行ったのは次のとおりです。

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
2
Louis Sayers