【问题标题】:Overring a Rails core mixin method, and still being able to call the old method覆盖 Rails 核心 mixin 方法,并且仍然能够调用旧方法
【发布时间】:2009-10-25 09:37:48
【问题描述】:

好的标题很混乱,我先告诉你我的问题:

polymorphic_url 方法在 Rails 2.2.1 中进行了更改,以包含一些我需要的额外功能。但是,我想让应用程序在旧版本的 Rails 中仍然可以运行,所以如果运行旧版本的 Rails,我想修补 2.2.1 的行为。

alias_method_chain 来救援对吧?我无法让它工作。

def polymorphic_url_with_compat(*args)
  whatever...
  return polymorphic_url(*args)
end
alias_method_chain :polymorphic_url, :compat

现在我首先尝试将它放在帮助程序中 - alias_method_chain 失败,因为那时 polymorphic_url 没有定义。 所以我将相同的代码移到控制器中,它没有出错,但它被忽略了。 然后我尝试使用插件将其修补到 ApplicationController::Base - polymorphic_url 仍未定义。

polymorphic_url 在模块 ActionController::PolymorphicRoutes 中定义。我真的不知道它何时/何​​处混合到控制器/视图中。

我怎样才能以我想要的方式包装这个方法?

【问题讨论】:

    标签: ruby-on-rails alias-method-chain


    【解决方案1】:

    在我们继续之前,您确定 polymorphic_url 存在于 Rails 2.2.1 之前的版本中吗?

    您的代码大部分是正确的,您忘记调用该方法的原始版本。在 alias_method_chain 调用之后重命名为 polymorphic_url_without_compat。

    class ActiveRecord::PolymorphicRoutes
      def polymorphic_url_with_compat(*args)
        whatever...
        return polymorphic_url_without_compat(*args)
      end
      alias_method_chain :polymorphic_url, :compat
    end
    

    您提到您尝试将其添加到插件中,因此如果前面的部分解决了您的问题,则可能不需要以下操作。

    确保它在 Rails 核心之后加载的最佳方法是将其转换为插件。

    $ script/generate plugin polymorphic_url_backport
    

    将创建一个插件存根。从现在开始的所有方向都与创建的插件目录相关。

    在init.rb中添加

    if RAILS_GEM_VERSION < "2.2.1"
      require File.dirname(__FILE__) + '/lib/yournamespace'
      ActionController::PolymorphicRoutes.send(:include, YourNameSpace::ActionController::PolymorphicRoutes) 
    end
    

    然后将上面的代码粘贴到你的 lib/yournamespace.rb 中

    module YourNameSpace
      class ActiveRecord::PolymorphicRoutes
        def included(base)
          base.class_eval %~
            def polymorphic_url_with_compat(*args)
              whatever...
              return polymorphic_url_without_compat(*args)
            end
            alias_method_chain :polymorphic_url, :compat
          ~
        end
      end
    end  
    

    只需确保插件随您的应用程序一起提供,应该没有问题。您也可以将它添加到您的 rails 根目录的 lib 中,但我不确定您将在正确的时间运行所需代码的确切位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 2019-08-18
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多