プログラムでクラス名FooBar
をシンボル:foo_bar
に変換するにはどうすればよいですか?例えばこのようなものですが、それはラクダのケースを適切に処理しますか?
FooBar.to_s.downcase.to_sym
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
レール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"
したがって、希望する意味に一致する場合は、これらのいずれかを使用する必要があります。利点:
ところで、human
にはI18Nを認識するという利点があります。
最初:gem install 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(/([^\^])([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