1

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

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 中定义。我真的不知道它何时/何​​处混合到控制器/视图中。

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

4

1 回答 1

3

在我们继续之前,您确定 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  

Just make sure the plugin ships with your application and there should be no problems. You could alternately add this to the lib of your rails root, but I'm no sure exactly where you would place the require code to run it at the right time.

于 2009-10-25T09:52:15.670 回答