内部app / models / abc / xyz.rb
module Abc::Xyz
extend ActiveSupport::Concern
end
内部app / models / abc.rb
class Abc < ActiveRecord::Base
include Abc::Xyz
end
当我尝试从Abc.where(id:id)获取数据时,有时它会起作用,有时会返回此错误(TypeError:错误的参数类型Class(预期的模块))。
TypeError: wrong argument type Class (expected Module)
app/models/abc.rb:2:in `include'
app/models/abc.rb:2:in `<class:Abc>'
app/models/abc.rb:1:in `<top (required)>'
activesupport (3.2.17) lib/active_support/dependencies.rb:469:in `load'
activesupport (3.2.17) lib/active_support/dependencies.rb:469:in `block in load_file'
activesupport (3.2.17) lib/active_support/dependencies.rb:639:in `new_constants_in'
activesupport (3.2.17) lib/active_support/dependencies.rb:468:in `load_file'
activesupport (3.2.17) lib/active_support/dependencies.rb:353:in `require_or_load'
activesupport (3.2.17) lib/active_support/dependencies.rb:502:in `load_missing_constant'
activesupport (3.2.17) lib/active_support/dependencies.rb:192:in `block in const_missing'
activesupport (3.2.17) lib/active_support/dependencies.rb:190:in `each'
activesupport (3.2.17) lib/active_support/dependencies.rb:190:in `const_missing'
activesupport (3.2.17) lib/active_support/inflector/methods.rb:230:in `block in constantize'
activesupport (3.2.17) lib/active_support/inflector/methods.rb:229:in `each'
activesupport (3.2.17) lib/active_support/inflector/methods.rb:229:in `constantize'
activesupport (3.2.17) lib/active_support/core_ext/string/inflections.rb:54:in `constantize'
答案 0 :(得分:13)
我认为你最好坚持关于担忧的Rails惯例:
app/models/concerns
如果您想像Abc::Xyz
那样命名您的问题,请确保将其放在正确的路径中:app/models/concerns/abc/xyz.rb
。
另一个好处是
module Abc::Xyz
假设已经定义了模块Abc
。如果没有它就会失败。所以也许你最好使用
class Abc
module Xyz
#...
end
end
请注意,我使用了class Abc
而不是模块,因为您的代码是隐含的。您不能同时拥有具有相同名称的类和模块。这也可能是你偶然发现错误的原因。请参阅Exploring Concerns上的这篇优秀文章。
Rails在(自动)加载常量时会尝试各种各样的东西但是最好坚持使用约定。我已经看到很多情况,由于定义/加载/执行常量的顺序,相同的代码片段在不同的时间点或不同的环境中失败。
答案 1 :(得分:0)
这不是解决OP问题的正确答案,但我认为它可以帮助人们在搜索错误消息时找到此问题。
对我来说,问题在于我有一个这样定义的帮助程序:
module Api
class MyControllerHelper
end
end
但是Rails期望助手是一个模块而不是一个类,因此应该是这样的:
module Api
module MyControllerHelper
end
end