对'with'和'without'方法名称修改感到困惑

时间:2013-09-16 17:14:12

标签: ruby-on-rails ruby routes

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

查看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的情况。我在插件代码中找不到它们,所以我想在轨道中发生某种元编程魔术。

我对alias_method_chain的复杂性不是很熟悉,但是之前看过这些模式的人能帮我理解发生了什么吗?该插件本身并不重要,我想知道 如何不使用 方法。

2 个答案:

答案 0 :(得分:1)

答案 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