Domanda

sto usando un motore di Rails, ma ho bisogno di personalizzare alcune azioni controllori.

Io in realtà biforcato il motore, e l'attuazione di tali personalizzazioni nelle mie forchetta, ma mi chiedevo se esiste un modo ufficiale in Rails Motori per ignorare e controllori di personalizzazione.

È stato utile?

Soluzione

Basta definire un controller con lo stesso nome nella cartella proprio app\controllers, e si troverà prima. In questo modo si può facilmente personalizzare.

Si prega di notare: perché si trova in primo luogo, si sostituisce l'intero controller dal motore. Questo potrebbe essere esattamente quello che vuoi. In alcuni casi, si desidera solo per regolare un po ', allora è molto meglio di riaprire la classe, e ridefinire solo ciò che è necessario.

Gli esempi da fare è può essere trovato qui: http: // edgeguides .rubyonrails.org / engines.html # imperative-modelli-e-controllori

Altri suggerimenti

Il collegamento nella risposta accettata in realtà non fornisce un esempio per l'override un controller. Citano "classing aperto" il file, ma non spiegano come esattamente fare. Se si apre la classe di motori nella vostra applicazione, si otterrà un errore di dipendenza circolare perché si fa riferimento / apertura di una classe che è attualmente in corso di definizione. Pertanto, è necessario assicurarsi che si carica classe effettiva del motore prima.

# in my app
# app/controllers/blazer/base_controller.rb
load Blazer::Engine.root.join('app/controllers/blazer/base_controller.rb')
Blazer::BaseController.class_eval do
  filter_access_to :all
end  

Nel mio caso, sto usando il Blazer gemma e l'aggiunta di autenticazione ad esso. Da quando uso l'autorizzazione dichiarativa, che Blazer non supporta direttamente, ho bisogno di aprire controller di base del Blazer e aggiungere il mio obbligo di autorizzazione ad esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top