我不确定如何表达这个问题,因为我不太明白这里发生了什么。
查看 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_subdomains
和significant_keys_without_subdomains
. 我不明白这些方法是如何被调用的,或者在 的情况下是如何significant_keys_without_subdomains
创建的。我在插件代码中找不到它们,所以我认为某种元编程魔法正在 Rails 中发生。
我对 alias_method_chain 的复杂性不是很熟悉,但是之前看过这些模式的人可以帮助我理解发生了什么吗?插件本身并不重要,我想知道有无方法是怎么来的。