2011-03-15 39 views
1

我正在使用Ruby on Rails 3,而且我試圖實現一個新的插件。爲了學習,我正在瀏覽裏面,我正在學習一些流行的插件。關於插件中的類的一些問題

我選用什麼是WillPaginatea its file有這樣的事情:

module WillPaginate 
    class << self 
    ... 
    end 
end 

if defined? Rails 
    WillPaginate.enable_activerecord if defined? ActiveRecord 
    WillPaginate.enable_actionpack if defined? ActionController 
end 

我想知道

  1. 爲什麼if defined? Rails語句是module語句外?什麼時候會運行內部的istructions?

  2. 什麼意思和如何使用class << self

回答

1
  1. module WillPaginate定義,使他們能夠在後面附帶一個電話到一些類紅寶石名範圍和羣體這些方法。 if defined? Rails位於模塊外部,因爲if中的代碼可能會將整個模塊包含到某個ActiveRecord類中。並且if恰好在加載will_paginate.rb文件時執行。

  2. 該塊中的所有方法都是類方法。因此,稍後可以撥打電話YourModelClass.foo

1

if defined? Rails塊期間require 'will_paginate'在加載時,也就是不。這使得will_paginate可以使用或不使用Rails。

class << self部分是一種在WillPaginate模塊上定義一組方法的方法,無需將它們全部定義爲​​。無論哪種方式都行得通(除了現在我不記得的幾個邊緣情況),所以它大多隻是一種風格選擇。