1

わかりにくいタイトルです。最初に私の問題を説明します。

この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

今、私は最初にこれをヘルパーに入れようとしました-それまでに定義されてalias_method_chainいないため失敗します。polymorphic_urlそのため、同じコードをコントローラーに移動しましたが、エラーにはなりませんが、無視されます。次に、プラグインを使用して ApplicationController::Base にパッチを適用しようとしましたpolymorphic_urlが、まだ定義されていません。

polymorphic_urlモジュール ActionController::PolymorphicRoutes で定義されています。コントローラー/ビューにいつ/どこで混合されるかはよくわかりません。

このメソッドを希望の方法でラップするにはどうすればよいですか?

4

1 に答える 1

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

于 2009-10-25T09:52:15.670 に答える