2012-12-28 61 views
56

我們如何在Ruby on Rails中從它的名稱字符串實例化類?如何在Rails中實例化名稱字符串中的類?

例如,我們在數據庫中以「ClassName」或「my_super_class_name」的格式命名它。

我們如何從中創建對象?

解決方案:

一直在尋找它自己,但沒有找到,所以在這兒呢。 Ruby-on-Rails API Method

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

它甚至可以沒有格式化,我們可以通過用戶字符串的方法.classify

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

當然,也許這不是很「Rails的方式」,但它解決了它的目的。

+4

Just FYI,constantize是一個ActiveSupport方便的方法,Object.const_get'和Classify是一個ActiveSupport方法,它試圖將字符串轉換爲標準的類格式。 你正在做的事情與Evginey的回答相同,還有一些額外的檢查。雖然constantize可能是一個更好的解決方案(因爲它可以進行理智檢查),但它有助於理解您使用的工具。 – quandrum

+0

謝謝你,說實話,沒有檢查它在手冊中做了什麼。 –

回答

57
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 
+0

因此,您無法訪問類方法。上面的解決方案可以正確使用類方法。 –

+0

是的,你可以實際' –

+0

加載開發環境(滑軌3.2.9) IRB(主要):001:0> NAME = 「PartnerGateway」 => 「PartnerGateway」 IRB(主要):002:0> =克拉斯名.constantize。新 =># klass .name => nil' –

24

其他人也可以尋找,如果它未能找到類,沒有拋出一個錯誤的選擇。 safe_constantize就是這樣。

class MyClass 
end 

"my_class".classify.safe_constantize.new # #<MyClass:0x007fec3a96b8a0> 
"omg_evil".classify.safe_constantize.new # nil 
2

我很驚訝,沒有人考慮到安全和他們的反應黑客。實例化一個可能來自用戶輸入的間接字符串,這是一個麻煩和黑客行爲。我們都應該/必須被列入白名單,除非我們確信字符串被完全控制和監測

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

class_for(name_wherever_this_came_from).create!(params_somehow) 

你怎麼會知道任意適當PARAMS無需白名單將是具有挑戰性的,但你的想法。

0

你可以簡單地轉換爲字符串,並初始化類出來的是:

klass_name = "Module::ClassName" 
klass_name.constantize 

要初始化一個新的對象:

klass_name.constantize.new 

我希望這原來是有幫助的。 謝謝!

相關問題