Ruby on rails 超越Rails核心混合方法,仍然能够调用旧方法
好吧,标题让人困惑,我先告诉你我的问题: 在Rails 2.2.1中,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
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