【问题标题】:how to use 'constantize' in custom controller module如何在自定义控制器模块中使用“常量化”
【发布时间】:2010-11-18 02:41:23
【问题描述】:

我有一个这样的模块:

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

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

【问题讨论】:

    标签: ruby-on-rails module


    【解决方案1】:

    constantize 方法将字符串转换为常量(例如类或模块)。然而,eval 调用已经返回了一个类,而不是一个字符串,所以从某种意义上说它已经完成了 constantize 会做的事情。

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

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

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

    【讨论】:

    • 谢谢 ryanb。我刚刚收到 rails:talk 的回复,表明我的错误在这里,就像你说的一样。实际上,“评估”是我的错字,对此感到抱歉。但我不认为'railscast'的著名作者实际上给了我答案。我很喜欢 Railscast。非常感谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      相关资源
      最近更新 更多