Railsコアミックスインメソッドをオーバーライドし、それでも古いメソッドを呼び出すことができる
-
06-07-2019 - |
質問
わかりやすいタイトルですが、最初に私の問題を説明します:
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モジュールで定義されています。コントローラ/ビューにいつ/どこで混在するかは本当にわかりません。
このメソッドを希望する方法でラップするにはどうすればよいですか?
解決
先に進む前に、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に追加することもできますが、適切なタイミングで実行するために必要なコードをどこに配置するかは正確にはわかりません。