![](/img/trans.png)
[英]rails console: How to include a "mixin" and call method from "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.