在此档案中:
...gems/actionpack-2.3.18/lib/action_controller/rescue.rb
在local_request?
中存在一个名为module Rescue
的方法,该方法包含在module ActionController
中,所以它是这样的:
module ActionController
...
module Rescue
...
protected
...
# True if the request came from localhost, 127.0.0.1. Override this
# method if you wish to redefine the meaning of a local request to
# include remote IP addresses or other criteria.
def local_request?
....
我想覆盖该方法以便将所有请求作为非本地处理,我尝试了这个(我认为是一个猴子补丁,不确定该术语是否错误)
module ActionController
module Rescue
protected
def local_request? #:doc:
false
end
end
end
它似乎有用(该方法返回false),但在发出请求时我收到错误:
undefined method `call_with_exception' for ApplicationController:Class
该方法存在于
中模块ActionController>模块救援>模块ClassMethods
1)如果我只覆盖一种方法,为什么这种方法未定义?即时删除我正在修改的其他方法/模块?
2)如何以及正确的方式做到这一点?
答案 0 :(得分:1)
在rails 2.3.x中,Rails使用ruby的自动加载方法来加载组成ActionController的模块(参见here:定义每个模块的文件仅在首次访问常量时加载。
因为你正在定义一个同名的常量,所以autoload永远不会被触发(因为就ruby而言它并不需要),所以rails提供的代码永远不会被加载。你可以改为
ActionController::Rescue.module_eval do
def local_request?
false
end
end
虽然在评论中指出你可以在你的控制器上定义它 - 不需要这样做。