2015-12-10 11 views
-1

我發現RailsCasts episode,並根據我的需要使用了這個邏輯和代碼示例。這個mapper模式是如何工作的?

但有一件事困擾我。

約束的樣子:

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

好吧,閱讀源代碼的一點點給了我一個線索。我發現一個更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?,然後用架子請求參數調用它。

+0

downvoting的原因,可能是? –