我的 Rails 应用程序中有一种情况,我需要根据当前运行时状态包含任意模块。该模块提供了仅在某些条件为真时才需要的自定义应用程序代码。基本上,我从当前上下文中提取公司名称并将其用作模块及其定义的文件名:
p = self.user.company.subdomain + ".rb"
if File.exists?(Rails.root + "lib/" + p)
include self.class.const_get(self.user.company.subdomain.capitalize.to_sym)
self.custom_add_url
end
我的测试模块如下所示:
module Companyx
def custom_add_url
puts "Calling custom_add_url"
end
end
现在在控制台中,这实际上工作正常。我可以拉一个用户并像这样包含模块:
[1] pry(main)> c = Card.find_by_personal_url("username")
[2] pry(main)> include c.class.const_get(c.user.company.subdomain.capitalize)=> Object
[3] pry(main)> c.custom_add_url
调用 custom_add_url
如果我尝试从我的模型中运行包含行,我会得到
NoMethodError: undefined method `include' for #<Card:0x007f91f9094fb0>
谁能建议为什么 include 语句可以在控制台上工作,但不能在我的模型代码中工作?