我找到了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映射器模块的一些源代码并没有让我理解。
答案 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?
,然后使用机架请求参数调用它。