0

ここで何が起こっているのかよくわからないので、この質問をどのように表現すればよいかわかりません。

Rails 2.x のこの古い gem を見てください (Rails バージョンは重要ではありません) https://github.com/goncalosilva/subdomain_routes/blob/master/lib/subdomain_routes/routes.rb。プラグインは Rails ルーティングを拡張し、このような多くのコードを実行します

module Route
def self.included(base)
    [ :add_route, :significant_keys].each { |method| base.alias_method_chain method, :subdomains }
end

def significant_keys_with_subdomains
    significant_keys_without_subdomains.tap do |result|
      if conditions[:subdomains].is_a? Symbol
        result << conditions[:subdomains]
        result.uniq!
      end
    end
  end

 ...
ActionController::Routing::Route.send :include, SubdomainRoutes::Routing::Route

プラグインは、標準の Route モジュール メソッドsignificant_keysを受け取り、それを独自の:subdomainsメソッドでチェーンします。ただし、この操作では、どういうわけか 2 つのメソッドsignificant_keys_with_subdomainssignificant_keys_without_subdomains. これらのメソッドがどのように呼び出されるか、または の場合は作成されるかがわかりませんsignificant_keys_without_subdomains。プラグイン コードでそれらを見つけることができないので、ある種のメタプログラミング マジックがレールで起こっていると考えています。

私は alias_method_chain の複雑さにあまり詳しくありませんが、これらのパターンを以前に見たことがある人は、何が起こっているのかを理解するのに役立ちますか? プラグイン自体は重要ではありません。with メソッドとwithoutメソッドがどのように発生するかを知りたいです。

4

2 に答える 2

1

への呼び出しの結果が表示されている可能性がありますalias_method_chain。これがどのように機能するかは次のとおりです。

alias_method_chain :some_awesome_method, :super_powers

基本的に、メソッドの新しい定義を作成し、some_awesome_method古いメソッドを にエイリアスしますsome_awesome_method_without_super_powers。新しいメソッドsome_awesome_methodは呼び出すだけsome_awesome_method_with_super_powersです (そのため、定義する必要があります)。しかし、元のbeforesome_awesome_method_without_super_powersを指すのは常にあります。some_awesome_methodalias_method_chain

詳細情報へのリンクは次のとおりです。http://apidock.com/rails/Module/alias_method_chain

于 2013-09-16T17:28:58.187 に答える
1

含まれているフックでは、alias_method_chainがエイリアスを作成します。

参考までに: https://github.com/goncalossilva/subdomain_routes/blob/master/lib/subdomain_routes/routes.rb#L46

于 2013-09-16T17:24:40.697 に答える