我有一个这样的模块:
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'。
但是,请你提供一些解决方法吗?
答案 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。