TypeError:错误的参数类型Class(预期模块)

时间:2014-04-02 21:50:46

标签: ruby-on-rails activesupport-concern

内部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'

2 个答案:

答案 0 :(得分:13)

我认为你最好坚持关于担忧的Rails惯例:

  1. 使用模块来定义您的问题
  2. 将问题置于app/models/concerns
  3. 之内

    如果您想像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