Rails模型类(生产中)包含Rails模块时不“包含”

时间:2012-08-18 04:46:10

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

继承我的示例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。我认为没有理由改变这一点。加载用户模型时(以及用户模型包含auth / user模块时)无关紧要。

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

注意:继续......只有在rails启动过程中的某个时间加载/需要包含它的类时,才会加载该模块。这就是强迫用户模型通过强制rails“看到”UsersController(因为加载路由)来加载“早期”的原因,还将包括auth / user模块。

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

任何人都能解开一些光明吗?我已经尝试了许多不同的东西来包含模块,例如打开User类并重新包含模块。这似乎有时起作用但不一致。

1 个答案:

答案 0 :(得分:0)

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

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