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


95

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

FooBar.to_s.downcase.to_sym

回答:


141

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

FooBar.name.underscore.to_sym

しかし、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

1
ありがとう。これはRailsの拡張機能だと思いました。:)私は実際にRailsを使用しているので、心配はありません。
ジョシュグローバー、

2
次に、それに応じて質問にタグを付ける必要があります。ここでは、あなたのためにやってみましょう...
kikito

5
いいえ、ActiveRecordではありません。ActiveSupport。
Rein Henrichs、2011

確かに、変更させてください
キキト

2
逆を行うには?
user1406062 2013年

72

Rails 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が命名規則を変更することを決定した(そうではない)イベントでも引き続き機能します。

ところで、humanI18Nを認識するという利点があります。


model_nameインスタンスオブジェクトでも機能します。例:foo_bar.model_name。完全なリストが必要な場合はfoo_bar.model_name.inspect、railsコンソールまたはデバッガーに書き込みます
ivanxuu

そして、私は反対/逆を探していましたがclassifymodelizeうまくいかなかったようです。
Pysis

7

最初:gem install activesupport

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

する必要がありますFooBar.to_s.underscore.to_sym私は、その後にフィードすることができ、シンボル、に(一定である)クラスを変換しようとしていることから、ファクトリー・ガール。:)
ジョシュグローバー

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

3
ActiveSupportはString#demodulize、前にパーツを削除し::ます。
amoebe

@amoebe-情報をありがとう。ただし、作業内容によって異なります-Railsアプリ(またはWebアプリ)で作業していない可能性があります。
Louis Sayers
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.