装饰不同命名空间中的类会覆盖功能

时间:2014-12-10 19:55:00

标签: ruby-on-rails ruby class module namespaces

情景:

我试图在Spree框架中装饰两个控制器:

Spree::Admin::ProductsController

Spree::ProductsController

相同的类名,但名称空间不同。

Spree::Admin::ProductsController中,我创建了before_action,声明如下:

module Spree
  module Admin
    ProductsController.class_eval do
      before_action :create_variant_options_array, only: [:edit]

      def create_variant_options_array
         # method details...
      end
   end
  end
end

问题:

后来,我试图打开Spree::ProductsController。我只编写了这个,

module Spree
  ProductsController.class_eval do
    # nothing written here yet, at this point
  end
end

...当我注意到before_action中的Spree::Admin::ProductsController不再被解雇时。实际上控制器的Admin版本中的任何内容都不会执行。唯一的解决方案是注释掉非管理员装饰的ProductsController.class_eval...部分。

从本质上讲,行为就好像非管理装饰器以某种方式影响(覆盖)更深层结构中的管理装饰器。

对于究竟发生在这里的事情,我有点不知所措。在我的“猜测”中,非管理员Spree::ProductsController装饰器以某种方式被应用于“更深层”版本,但即使是这种情况,我也不知道.class_eval将< em>删除或否定在另一个装饰器中应用的功能。或者,我可能会做一些非常明显的事情,而我根本看不到;但如上所述,我目前无法解释这种行为。

问题:

鉴于所描述的场景,当非管理装饰器试图装饰不同(更高)的同名类时,可能导致before_action装饰器中的Admin停止运行的原因module / namespace?

0 个答案:

没有答案