这个映射器模式如何工作?

时间:2015-12-10 21:13:32

标签: ruby-on-rails

我找到了RailsCasts episode,并根据我的需要使用了这个逻辑和代码示例。

但有一件事困扰着我。

约束看起来像:

 constraints(Subdomain.new) do ... end

使用此代码:

class Subdomain
  def matches?(request)
    ....
    end
  end
end

它有效。

但我没有得到两件事。首先,我不会在任何地方调用matches?,为什么在初始化Subdomain.new时执行此方法?

第二个问题。我没有传递任何参数,但它以某种方式将request参数分配给实际的机架请求,它只是有效。

例如,我不喜欢这种语法:

constraints(Subdomain.new) do ... end

所以我决定使用方法subdomain(request)创建模块,但是当它成为模块时,它开始引发错误的数字或参数错误(0表示1)。

我发现方法matches?是在mapper.rb中定义的,可能是它在rails中向后调用,但是这样它应该被我的子域文件覆盖?如果没有,因为我的matches是类方法,它在没有应用它的任何子域实例的情况下如何工作?

正如我所说,一切正常,但我想了解究竟发生了什么,因为我不喜欢使用看起来像是大卫魔法代码的东西。

阅读Rails映射器模块的一些源代码并没有让我理解。

1 个答案:

答案 0 :(得分:-1)

嗯,更多的阅读源代码给了我一个线索。我又找到了一个matches?,为@constraints

定义
 def matches?(req)
          @constraints.all? do |constraint|
            (constraint.respond_to?(:matches?) && constraint.matches?(req)) ||
              (constraint.respond_to?(:call) && constraint.call(*constraint_args(constraint, req)))
          end
        end

因此,对于每个约束,它会检查它是否响应matches?,然后使用机架请求参数调用它。