2015-10-25 11 views
6

Sto leggendo alcuni codici che utilizzano le preoccupazioni in Rails 4.cosa fa class_methods nei problemi?

ho letto alcuni articoli da dire, se vogliamo comprendere i metodi della classe utilizzando il modulo ClassMethods, ma il codice che ho letto usando qualcosa come:

class_methods do 
    def **** 
    end 
end 

risposta

4

È solo per comodità. module ClassMethods è puro rubino, ma class_methods è definito in ActiveSupport::Concern per comodità. Se si guarda a un codice sorgente troverete che class_methods fa esattamente la stessa cosa

# activesupport/lib/concern.rb 
    def class_methods(&class_methods_module_definition) 
    mod = const_defined?(:ClassMethods, false) ? 
     const_get(:ClassMethods) : 
     const_set(:ClassMethods, Module.new) 

    mod.module_eval(&class_methods_module_definition) 
    end 
+1

Non credo 'modulo ClassMethods' è "ruby pura" esattamente se - nulla nel linguaggio Ruby farà automaticamente qualcosa di speciale con un sotto-modulo chiamato' ClassMethods', anche questo proviene da 'ActiveSupport :: Concern'. – jrochkind

+0

Sì, Ruby non farà nulla con ClassMethods da solo, ma non proviene da ActiveSupport. Forse per ragioni storiche le persone usano questo nome di modulo, non lo so. Ma è ancora puro Ruby. Puoi nominare questo modulo come vuoi http://yehudakatz.com/2009/11/12/better-ruby-idioms/ –

+0

Ti stai sbagliando, ActiveSupport :: Concern farà davvero qualcosa di speciale con un sottomodulo specificamente chiamato ' ClassMethods', fa esattamente quello che ti aspetti. https://github.com/rails/rails/blob/d06e42518a4fdd1732f1d75a43c69071bcd79245/activesupport/lib/active_support/concern.rb#L119 e https://github.com/rails/rails/blob/d06e42518a4fdd1732f1d75a43c69071bcd79245/activesupport/lib/active_support/ concern.rb # L135-L137 – jrochkind

0

class_methods viene utilizzato per aggiungere metodi di classe per il modello utilizzato dalla preoccupazione.

Un tipico modulo simile a questa:

module M 
    def self.included(base) 
    base.extend ClassMethods 
    end 

    module ClassMethods 
    ... 
    end 
end 

Utilizzando ActiveSupport::Concern il modulo di cui sopra potrebbe invece essere scritta come:

require 'active_support/concern' 

module M 
    extend ActiveSupport::Concern 

    class_methods do 
    ... 
    end 
end 

Come Oleg Antonyan pointed out, dal codice sorgente, sappiamo che sta andando utilizzare il modulo ClassMethods sotto il cofano.

Riferimento: http://api.rubyonrails.org/classes/ActiveSupport/Concern.html