83

Ruby-on-Railsの名前文字列からクラスをインスタンス化するにはどうすればよいですか?

たとえば、データベースには「ClassName」や「my_super_class_name」のような形式の名前があります。

それからオブジェクトを作成するにはどうすればよいですか?

解決:

自分で探していたのですが、見つかりませんでしたので、こちらです。 Ruby-on-RailsAPIメソッド

name = "ClassName"
instance = name.constantize.new  

フォーマットしなくても、文字列メソッド.classifyを使用できます。

name = "my_super_class"
instance = name.classify.constantize.new

もちろん、これはあまり「レールウェイ」ではないかもしれませんが、それはその目的を解決します。

4

4 に答える 4

86
klass = Object.const_get "ClassName"

クラスメソッドについて

class KlassExample
    def self.klass_method
        puts "Hello World from Class method"
    end
end
klass = Object.const_get "KlassExample"
klass.klass_method

irb(main):061:0> klass.klass_method
Hello World from Class method
于 2012-12-28T13:41:31.103 に答える
46

他の人も、クラスが見つからなくてもエラーをスローしない代替手段を探している可能性があります。safe_constantizeそれだけです。

class MyClass
end

"my_class".classify.safe_constantize.new #  #<MyClass:0x007fec3a96b8a0>
"omg_evil".classify.safe_constantize.new #  nil 
于 2015-03-06T23:53:38.273 に答える
14

次の方法で、文字列を変換してクラスを初期化できます。

klass_name = "Module::ClassName"
klass_name.constantize

新しいオブジェクトを初期化するには:

klass_name.constantize.new

これがお役に立てば幸いです。ありがとう!

于 2017-02-23T11:11:26.023 に答える
6

誰も彼らの応答でセキュリティとハッキングを考慮していないことに私は驚いています。ユーザー入力から間接的にも発生した可能性のある任意の文字列のインスタンス化は、トラブルやハッキングを求めています。文字列が完全に制御および監視されていることが確実でない限り、すべてのユーザーがホワイトリストに登録する必要があります。

def class_for(name)
  {
    "foo" => Foo,
    "bar" => Bar,
  }[name] || raise UnknownClass
end

class_for(name_wherever_this_came_from).create!(params_somehow)

ホワイトリストがなくても適切なパラメータを任意に知る方法は難しいでしょうが、あなたはその考えを理解します。

于 2016-11-18T16:25:44.140 に答える