Make Rails自动加载/重新加载遵循动态包含

时间:2017-02-13 14:45:21

标签: ruby-on-rails ruby ruby-on-rails-3 metaprogramming

上下文

我想通过自动包含的问题为所有模型添加一些特定于管理员的代码。我正在使用命名约定MyModel => MyModelAdmin并且它们位于标准的Rails目录app/models/concerns/my_model_admin.rb中。然后我可以对所有这些进行全局操作并执行MyModel.include(MyModelAdmin)

问题

动态包括正常工作,但在更改开发中的关注时,Rails不会正确地重新加载它。事实上,这种担忧似乎已被消除。

生殖

应用程序/模型/ my_model.rb

class MyModel
end

应用程序/模型/关切/ my_model_admin.rb

module MyModelAdmin
  extend ActiveSupport::Concern

  def say
    "moo"
  end
end

配置/初始化/ .RB

MyModel.include(MyModelAdmin)

到目前为止一切顺利,MyModel.new.say == "moo" 但现在改变说“baa”,你得到NoMethodError undefined method 'say'

备注

我尝试了许多没有帮助的事情:

  • require_dependency
  • Model.class_eval "include ModelAdministration"
  • config.autoload_paths
  • ApplicationModel中使用另一个显式问题,并使用included挂钩,其中包含每个模型中的特定问题。
  • ActiveSupport.on_load仅在Base上触发而不是每个模型。

这是否意味着Rails只能使用静态范围进行自动加载?我猜Rails认为关注点发生变化,知道模型是否包含它,重新加载模型但是静态模型定义没有包含因此关注会丢失并停止跟踪。有没有办法强制Rails跟踪动态包含的模块?

0 个答案:

没有答案