簡體   English   中英

覆蓋Rails核心mixin方法,並且仍然能夠調用舊方法

[英]Overring a Rails core mixin method, and still being able to call the old method

好的標題令人困惑,我先告訴你我的問題:

在Rails 2.2.1中更改了polymorphic_url方法,以包括我需要的一些額外功能。 但是,我想使該應用程序在舊版本的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中定義。 我真的不知道何時/何地將其混入控制器/視圖中。

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

在我們繼續之前,您確定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根目錄的lib中,但是我不確定您將在正確的時間放置要求代碼的確切位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM