【问题标题】:Rails Module not 'included' when included by a Rails Model Class (in Production)Rails 模型类包含时,Rails 模块未“包含”(生产中)
【发布时间】:2012-08-14 12:00:51
【问题描述】:

这是我的示例 Rails 模型类(在 app/models/user.rb 中):

class User < ActiveRecord::Base
  puts "loading user model"
  include Auth::User # module is in the Auth engine
end

这是一个名为 auth 的引擎中的模块(文件位于 vendor/engines/app/models/auth/user.rb 中)

module Auth
  module User
    puts "loading module"
    self.included(base)
      puts "module is included"
    end
  end
end

当 rails (3.1.1 ruby​​ 1.92) 启动时(在非开发中),我看到“正在加载用户模型”和“正在加载模块”,但没有看到“包含模块”。

如果我将模块的名称和文件名从 models/auth/user.rb 更改为 user_auth.rb,如果模块“足够早”包含在 rails init 进程中,我可能会看到“包含”(请参阅以下)。我想将模块的名称和文件名保留为用户。我认为没有理由必须改变这一点。当我加载 User 模型(以及当 User 模型包含 auth/user 模块时)时,这无关紧要。

注意:当我在上面说“MAY”时,这是我观察到的:如果 rails “碰巧”需要加载一个 UsersController,那么它只会加载 User 对象,并且只有当我将用户模块重命名为 UserAuth(或与模型名称不同的名称)。由于路由,我“碰巧”加载了 UsersController。我知道这一点是因为我打印了一个堆栈跟踪。所以我可以通过 1) 重命名模块和 2) 强制它使用控制器加载来包含模块。

注意:继续...仅当包含它的类在 Rails 启动过程中的某个时候加载/需要时才加载该模块。这就是为什么通过强制rails“看到”UsersController(因为加载路由)来强制User模型“提前”加载的原因也将包括auth/user模块。

注意:如果我运行控制台(同样,在非开发模式下)然后执行 require 'user',则不包含该模块。因此,如果我“等待”直到 rails 完全加载后,当我需要用户时,auth/user 模块不包括在内。我认为这有点不准确,我看到在 rails init 过程中加载了用户模型,我看到正在加载 auth/user 模块,但当时没有看到 auth/user 模块。如果用户模型在 rails init 进程中“早期”加载,我只会看到包含的模块。或者它可能“在 rails init 进程中的某个神奇时间加载)。

谁能解释一下?我尝试了许多不同的方法来包含模块,例如打开 User 类并重新包含模块。这似乎有时有效,但并非始终如一。

【问题讨论】:

  • 我重命名了基于身份验证的模块,现在 rails/ruby 包含这些模块。在上面的代码中,module User 变成了module UserAuth。这似乎避免了正在发生的任何混淆,并且模块包含在类中。接下来,我将让我的引擎需要模块文件 `../app/models/auth/user.rb',这样我就不必依赖正在加载的控制器来加载模块。

标签: ruby-on-rails module include require production


【解决方案1】:

您可以在类定义之前的第一行将其添加到您的模型中吗? (这里只是调试,如果这不起作用请不要拒绝我)

 load "#{Rails.root}/vendor/engines/app/models/auth/user.rb"

【讨论】:

  • 我得到如下信息:LoadError: Expected .../vendor/engines/auth/app/models/auth/user.rb 来定义用户。这让我相信我不能让我的模块与我的班级命名相同。对我来说似乎是一个严重的限制。
  • 你知道,我想我以前确实遇到过这个错误。 rails 很难处理命名空间,尤其是当它们与底层的同名模型冲突时。对不起,我不能比这更有帮助了..
猜你喜欢
  • 2012-02-19
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多