17

Questa è una grande idea di preoccupazione in rotaie: http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concernsRails ActiveSuppport: Preoccupazione e metodi privati ​​

Ed è anche una buona idea per fare molto piccoli metodi che non fanno parte di un'API pubblica. Senza usare preoccupazioni, quelli diventano metodi privati ​​in una classe di rubini.

Ha senso creare metodi privati ​​all'interno di un modulo Rails ActiveSupport :: Concern? In tal caso, funziona privatamente sia per i metodi di istanza regolari che per i metodi di classe nella definizione di preoccupazione?

risposta

16

Ha senso creare metodi privati ​​all'interno di un modulo Rails ActiveSupport::Concern?

Considerando che le preoccupazioni sono moduli intelligenti che verranno eventualmente inclusi in altre classi - sì, è così. È solo un codice portatile, un comportamento estraibile e mi piacerebbe considerarlo come parte del mio controller (o modello, ecc.) Mentre lo sto scrivendo. Quindi, in pratica, dichiari semplicemente i metodi private o protected come faresti normalmente.

Forse the post you linked sono state aggiornate dal 2013, ma DHH fa esattamente che in quello degli esempi là:

module Dropboxed 
    extend ActiveSupport::Concern 

    included do 
    before_create :generate_dropbox_key 
    end 

    def rekey_dropbox 
    generate_dropbox_key 
    save! 
    end 

    private # <- Let's list some privates 

    def generate_dropbox_key 
    self.dropbox_key = SignalId::Token.unique(24) do |key| 
     self.class.find_by_dropbox_key(key) 
    end 
    end 
end 

Per quanto riguarda private metodi di classe, sono d'accordo con @Hugo e mai usato io stesso, ma Ecco come ottenere questo risultato:

module Dropboxed 
    extend ActiveSupport::Concern 

    included do 
    private_class_method :method_name 
    end 

    module ClassMethods 
    def method_name 
    end 
    end 
end 
+0

Questo non renderà il metodo nascosto, è comunque necessario utilizzare la parola chiave "privata" per questo. –

+0

Sembra che quando chiamato da un metodo del problema, 'self.class.method_name' non è accessibile perché privato. – ybart

2

È solo una mia opinione ma in questo momento sto grattando la testa sul metodo delle classi private, a cosa servono? Ad ogni modo, se proprio ne hai bisogno, fai riferimento a questo post: How to create a private class method?

Ha senso avere metodi di istanza privati ​​in un modulo di preoccupazione e funzionerà correttamente. I metodi di classe privata funzioneranno bene, ma seguendo il post sopra indicato.

+0

è semplice: è necessario suddividere il metodo di classe in blocchi più piccoli e non si desidera esporre quei blocchi nell'interfaccia di classe. Fondamentalmente la stessa ragione per cui useresti metodi privati ​​in qualsiasi altro caso. – meta