2010-10-25 14 views
7

Sto cercando di estrarre un codice comune in una gemma.rails3 gem: act_as_something

Sto pensando che acts_as_something è una buona strategia per il semplice riutilizzo.

Esiste un buon tutorial che ne discuta per rails3 gems? Ho trovato diversi che discutere rails2 (come http://guides.rubyonrails.org/plugins.html), ma che è specifico per rails2

ecco alcuni dei tutorial/blog ho già letto:

grazie

risposta

12

aggiornamento regolare TE: Ho aggiunto un post sulla base di questa risposta, ma con molto più particolare: http://thoughtsincomputation.com/posts/coding-an-acts_as-gem-for-rails-3

-

io non sono a conoscenza di un'altra fonte tutorial di fuori della parte superiore della mia testa, ma qui ci sono alcuni consigli generali.

Rails 3 utilizza una funzione veramente utile chiamata Railtie - vedere http://api.rubyonrails.org/classes/Rails/Railtie.html.

Quindi, se dovessi implementare una gemma act_as_ *, inizierei da lì. Il mio railtie potrebbe essere simile:

# lib/acts_as_awesome/railtie.rb 
require 'rails' 
require 'acts_as_awesome' 

module ActsAsAwesome 
    class Railtie < Rails::Railtie 
    config.to_prepare do 
     ApplicationController.send(:extend, ActsAsAwesome::Hook) 
    end 
    end 
end 

e il codice ActsAsAwesome :: Hook:

# lib/acts_as_awesome/hook.rb 
module ActsAsAwesome::Hook 
    def acts_as_awesome(*args) 
    options = args.extract_options! 
    # do the things that make the controller awesome. 
    include ActsAsAwesome::InstanceMethods 
    before_filter :an_awesome_filter 
    end 
end 

mi sento i concetti qui sono solidi e hanno utilizzato processi simili in precedenza. Fondamentalmente, direbbe a Rails di eseguire il blocco to_prepare una volta durante la produzione e prima di ogni richiesta in fase di sviluppo (lo vogliamo perché ApplicationController verrà ricaricato in quei momenti, potenzialmente cancellando il nostro metodo hook); e l'hook è proprio questo: aggiunge un hook a tutti i controller (o meglio, tutti i controller che estendono ApplicationController) per consentire all'utente di introdurre il vero codice "Awesome" nei loro controller senza influenzare altrimenti i controller che non ne hanno bisogno.

L'hook #acts_as_awesome non fornisce di per sé la funzionalità Awesome. Questo perché non tutti i controller potrebbero aver bisogno di questa funzionalità. Invece, il metodo è responsabile dell'introduzione del reale, tramite il modulo ActsAsAwesome :: InstanceMethods. In questo modo, l'utente ottiene la funzionalità Awesome solo se chiama esplicitamente il metodo act_as_awesome. Aggiunge anche un filtro precedente al controller per dimostrare che il codice in questo metodo sarebbe stato valutato esattamente come se fosse nella classe del controllore di destinazione stesso.

Questa tecnica dovrebbe funzionare esattamente allo stesso modo se si mirano ai modelli anziché ai controller: è sufficiente inserire il proprio hook in ActiveRecord :: Base. Come AR: B è caricato solo all'avvio di Rails, probabilmente dovresti essere in grado di inserirlo in un inizializzatore (fai riferimento ai documenti di Railtie), ma mi riservo il diritto di sbagliare qui.

Un getcha riguardante il railtie: la documentazione si legge come se dovesse essere stata rilevata automaticamente, ma spesso ho problemi con questo.Per aggirare il problema, è sufficiente richiedere i binari dal file sorgente principale della tua gemma (nell'esempio precedente, sarebbe lib/acts_as_awesome.rb).

si può vedere l'intera sorgente ActsAsAwesome in tutto il suo splendore al mio conto github: http://github.com/sinisterchipmunk/acts_as_awesome

Spero che questo sia utile. La tua domanda era piuttosto di alto livello, quindi una risposta di alto livello è la migliore che posso fare.

-Colin MacKenzie IV

http://thoughtsincomputation.com

@sinisterchipmnk

+0

grazie tanto. Stavo seguendo i tuoi tutorial. questo è utile. – cbrulak

+0

Nessun problema, felice di aiutare. Grazie per aver letto (e menzionato!) I miei contenuti :) Non avrei mai visto questa domanda se non fosse stato per il collegamento. (L'ho visto comparire nelle statistiche del sito, heh.) – sinisterchipmunk

+0

Ho creato una gemma basata su quell'articolo e un vecchio plugin Rails. Se vuoi puoi dare un'occhiata a questo, dato che è un buon esempio: https://github.com/toptierlabs/acts_as_fulltextable – Tony