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
grazie tanto. Stavo seguendo i tuoi tutorial. questo è utile. – cbrulak
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
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