2009-10-25 19 views
1

好的标题是混乱的,伊利诺伊州第一个告诉你,我的问题:Overring一个Rails核心混入方法,并仍然能够调用旧方法

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 

现在,我第一次尝试把这个在助手 - 因为polymorphic_url心不是通过再定义alias_method_chain失败。 所以我把相同的代码移到了控制器中,它没有错误,但它被忽略。 然后我尝试使用插件将其修补到ApplicationController :: Base中 - polymorphic_url仍未定义。

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

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

回答

3

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

你的代码大部分是正确的,你忘记调用方法的原始版本。在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根目录下,但是我不确定你要在什么地方放置需要的代码才能在正确的时间运行它。

+0

不错:)。 thx EmFi! – reto 2009-11-02 17:09:28

相关问题