2009-08-09 47 views
1

我有一個這樣的模塊:如何在自定義控制器模塊使用「constantize」

module Controller 
    module LocaleModels 
    def self.included(base) 
     base.send :include, InstanceMethods 
    end 

    module InstanceMethods 
     def locale_Lexeme; constantize_model('Lexeme') end 
     def locale_Synthetic; constantize_model('Synthetic') end 
     def locale_Property; constantize_model('Property') end 

     private 
     def constantize_model(common_part) 
     eval(I18n.locale.capitalize + '::' + common_part).constantize 
     end 
    end 
    end 
end 

但我一直得到

NoMethodError (undefined method `constantize' for #<Class:0x2483b0c>) 

我想我不能自定義模塊中使用「constantize」 。

但是,你能提供一些解決方法嗎?

回答

5

constantize方法將字符串轉換爲常量(例如類或模塊)。但是,eval調用已經返回一個類,而不是一個字符串,因此從某種意義上說,它已經完成了constantize的工作。

我建議刪除eval調用,因爲constantize使用起來更安全。

def constantize_model(common_part) 
    (I18n.locale.capitalize + '::' + common_part).constantize 
end 

這樣,你在一個字符串調用constantize如預期。

+0

謝謝ryanb。 我剛剛收到了來自rails的回覆:在這裏說明我的錯誤,跟你說的一樣。 其實,'eval'是我的一個錯字,對不起。 但我不認爲着名的'railscast'的作者實際上給了我答案。我是Railscast的一大樂趣。非常感謝你。 – boblu 2009-08-10 00:36:51

0

檢查eval調用是否返回一個String對象。如果確實檢查它是否在camelcase中。如果它不在camelcase中,請嘗試使用camelize。

相關問題