Railsコアミックスインメソッドをオーバーライドし、それでも古いメソッドを呼び出すことができる

StackOverflow https://stackoverflow.com/questions/1620468

  •  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に追加することもできますが、適切なタイミングで実行するために必要なコードをどこに配置するかは正確にはわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top