如何使动态添加的方法对 Rails 4.2.0 控制器可见?
How to make dynamically added methods visible to Rails 4.2.0 controller?
这是 Rails 3.2.12 中将动态方法添加到应用程序控制器的方式:
module WfHelper
extend ActiveSupport::Concern
included do
before_action :load_wf_action_def
end
protected
def load_wf_action_def
#load methods with eval()
end
end
在应用程序控制器中,包含模块wf_helper:
include WfHelper
load_wf_action_def
中定义的所有方法都可用于应用程序控制器。然而,升级到 Rails 4.2.0 后,代码停止工作,应用程序控制器不再可见这些方法。调试显示 base.before_action :load_wf_action_def
正常执行,但其方法未添加到控制器 class 的 action_methods
中(AbstractController::ActionNotFound
调用动态方法时)。问题来自操作包中的 base.rb。我们不知道 base.rb 中的确切变化是什么导致代码被破坏。有没有人为 Rails 4 添加动态方法到控制器并想分享经验?
我所做的是手动将操作添加到 Controller.action_methods
并解决了问题。
这是 Rails 3.2.12 中将动态方法添加到应用程序控制器的方式:
module WfHelper
extend ActiveSupport::Concern
included do
before_action :load_wf_action_def
end
protected
def load_wf_action_def
#load methods with eval()
end
end
在应用程序控制器中,包含模块wf_helper:
include WfHelper
load_wf_action_def
中定义的所有方法都可用于应用程序控制器。然而,升级到 Rails 4.2.0 后,代码停止工作,应用程序控制器不再可见这些方法。调试显示 base.before_action :load_wf_action_def
正常执行,但其方法未添加到控制器 class 的 action_methods
中(AbstractController::ActionNotFound
调用动态方法时)。问题来自操作包中的 base.rb。我们不知道 base.rb 中的确切变化是什么导致代码被破坏。有没有人为 Rails 4 添加动态方法到控制器并想分享经验?
我所做的是手动将操作添加到 Controller.action_methods
并解决了问题。