如何在自定义控制器模块中使用'constantize'

时间:2009-08-09 16:35:58

标签: ruby-on-rails module

我有一个这样的模块:

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'。

但是,请你提供一些解决方法吗?

2 个答案:

答案 0 :(得分:5)

constantize方法将字符串转换为常量(例如类或模块)。但是,eval调用已经返回了一个类,而不是一个字符串,因此从某种意义上说它已经完成了constantize将要执行的操作。

我建议删除eval来电,因为constantize使用起来更安全。

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

这样你就可以按照预期在字符串上调用constantize

答案 1 :(得分:0)

检查eval调用是否返回String对象。如果它确实检查它是否在camelcase中。如果它不在camelcase中,请尝试使用camelize。