0

我不确定如何表达这个问题,因为我不太明白这里发生了什么。

查看 Rails 2.x 的这个旧 gem(Rails 版本不重要)https://github.com/goncalossilva/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方法链接起来。然而,在这个操作中,它也以某种方式构建了两种方法significant_keys_with_subdomainssignificant_keys_without_subdomains. 我不明白这些方法是如何被调用的,或者在 的情况下是如何significant_keys_without_subdomains创建的。我在插件代码中找不到它们,所以我认为某种元编程魔法正在 Rails 中发生。

我对 alias_method_chain 的复杂性不是很熟悉,但是之前看过这些模式的人可以帮助我理解发生了什么吗?插件本身并不重要,我想知道有无方法是怎么来

4

2 回答 2

1

在包含的钩子中,alias_method_chain创建别名。

仅供参考:https ://github.com/goncalossilva/subdomain_routes/blob/master/lib/subdomain_routes/routes.rb#L46

于 2013-09-16T17:24:40.697 回答
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(所以你需要定义它)。但是你总是有some_awesome_method_without_super_powers哪个指向你原来的some_awesome_method之前alias_method_chain

这是更多信息的链接:http: //apidock.com/rails/Module/alias_method_chain

于 2013-09-16T17:28:58.187 回答