Ruby on rails 超越Rails核心混合方法,仍然能够调用旧方法

Ruby on rails 超越Rails核心混合方法,仍然能够调用旧方法,ruby-on-rails,alias-method-chain,Ruby On Rails,Alias Method Chain,好吧,标题让人困惑,我先告诉你我的问题: 在Rails 2.2.1中,polymorphic\uURL方法被更改,以包含我需要的一些额外功能。但是,我想让应用程序仍然在旧版本的Rails中工作,因此如果旧版本的Rails正在运行,我想修补2.2.1的行为 alias\u method\u链到救援右侧?我不能让它工作 def polymorphic_url_with_compat(*args) whatever... return polymorphic_url(*args) end al

好吧,标题让人困惑,我先告诉你我的问题:

在Rails 2.2.1中,
polymorphic\uURL
方法被更改,以包含我需要的一些额外功能。但是,我想让应用程序仍然在旧版本的Rails中工作,因此如果旧版本的Rails正在运行,我想修补2.2.1的行为

alias\u method\u链
到救援右侧?我不能让它工作

def polymorphic_url_with_compat(*args)
  whatever...
  return polymorphic_url(*args)
end
alias_method_chain :polymorphic_url, :compat
现在我首先尝试将其放入helper-
alias\u method\u chain
失败,因为那时还没有定义
polymorphic\u url
。 所以我把同样的代码移到了控制器中,它没有出错,但是被忽略了。 然后我尝试用一个插件将其修补到ApplicationController::Base中-
多态url
仍然没有定义

polymorphic\u url
在模块ActionController::PolymorphicRoutes中定义。我真的不知道它何时/何地混合到控制器/视图中


如何以我想要的方式包装此方法?

在继续之前,您确定2.2.1之前的Rails版本中存在多态url吗

您的代码基本上是正确的,您忘记调用该方法的原始版本。在别名\u方法\u链调用之后,将其重命名为多态\u url\u,而不使用\u 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
只要确保插件随应用程序一起提供,就不会有问题。您可以交替地将其添加到rails根目录的lib中,但我不确定您将在正确的时间将所需代码放置在何处以运行它

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