7

在 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:错误的参数类型类(预期的模块))。

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'
4

2 回答 2

14

我认为你最好遵守 Rails 的关于关注点的约定:

  1. 使用模块来定义您的关注点
  2. 把顾虑放在里面app/models/concerns

如果您想将您的关注点命名为 in Abc::Xyz,请确保将其放置在正确的路径中:app/models/concerns/abc/xyz.rb.

另一个优点是

module Abc::Xyz

假设模块Abc已经被定义。如果没有,它将失败。所以也许你最好使用

class Abc
  module Xyz
    #...
  end
end 

请注意,我使用class Abc而不是模块作为您的代码所暗示的。您不能同时拥有同名的类和模块。这也可能是您偶尔出现错误的原因。请参阅这篇关于Exploring Concerns的精彩文章。

Rails 在(自动)加载常量时会尝试各种东西,但最好还是遵守约定。我见过很多情况,由于常量的定义/加载/执行顺序,相同的代码片段在不同的时间点或不同的环境中失败。

于 2014-05-07T09:20:17.423 回答
1

这不是 OPs 问题的正确答案,但我认为它可以帮助人们在搜索错误消息时找到这个问题。

对我来说,问题是我有一个这样定义的助手:

module Api
  class MyControllerHelper
  end
end

但是 Rails 期望 helper 是一个模块而不是一个类,所以它应该是这样的:

module Api
  module MyControllerHelper
  end
end

于 2020-11-21T20:02:18.743 回答