我不确定如何说出这个问题,因为我不太明白这里发生了什么。
查看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
的情况。我在插件代码中找不到它们,所以我想在轨道中发生某种元编程魔术。
我对alias_method_chain的复杂性不是很熟悉,但是之前看过这些模式的人能帮我理解发生了什么吗?该插件本身并不重要,我想知道 与 和 如何不使用 方法。
答案 0 :(得分:1)
在包含钩子中,alias_method_chain创建别名。
仅供参考:https://github.com/goncalossilva/subdomain_routes/blob/master/lib/subdomain_routes/routes.rb#L46
答案 1 :(得分: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