rails core

时间:2015-10-09 23:37:59

标签: ruby-on-rails ruby

在此档案中:

...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)如何以及正确的方式做到这一点?

1 个答案:

答案 0 :(得分:1)

在rails 2.3.x中,Rails使用ruby的自动加载方法来加载组成ActionController的模块(参见here:定义每个模块的文件仅在首次访问常量时加载。

因为你正在定义一个同名的常量,所以autoload永远不会被触发(因为就ruby而言它并不需要),所以rails提供的代码永远不会被加载。你可以改为

ActionController::Rescue.module_eval do
   def local_request?
      false
   end
end 

虽然在评论中指出你可以在你的控制器上定义它 - 不需要这样做。