情景:
我试图在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?