2010-05-21 11 views
13

Ich verwende eine Rails-Engine, aber ich muss einige Controller-Aktionen anpassen.Eine Rails Engine Controller-Aktion überschreiben

Ich habe die Engine tatsächlich gegabelt und diese Anpassungen in meine eigene Verzweigung implementiert, aber ich habe mich gefragt, ob es eine offizielle Möglichkeit in Rails Engines gibt, Controller zu überschreiben und anzupassen.

+0

Schauen Sie dort http://stackoverflow.com/questions/5045068/extending-controllers-of-rails-3-engine-in-the-main-app – Andrei

Antwort

18

Definieren Sie einfach einen Controller mit dem gleichen Namen in Ihrem eigenen Ordner app\controllers, und es wird zuerst gefunden. So können Sie es leicht anpassen.

Bitte beachten Sie: Weil es zuerst gefunden wird, ersetzen Sie den gesamten Controller vom Motor. Dies könnte genau das sein, was Sie wollen. In einigen Fällen möchten Sie nur ein wenig anpassen, dann ist es viel besser, die Klasse wieder zu öffnen und nur neu zu definieren, was benötigt wird. http://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers in der akzeptierten Antwort

+0

Viel einfacher als eine benutzerdefinierte Gabel zu halten! Danke und Entschuldigung für die lahme Frage! –

+0

Dies überschreibt den gesamten Controller, nicht nur eine Aktion. –

+0

Ich habe nichts anderes behauptet. Aber zumindest kannst du es anpassen. Hast du eine bessere Lösung? – nathanvda

2

Der Link ein Beispiel eine Steuerung zum Überschreiben nicht wirklich bieten:

Beispiele sind zu tun, sind hier zu finden. Sie erwähnen "Open Classing" der Datei, aber nicht wie genau es zu tun ist. Wenn Sie die Engine-Klasse in Ihrer App öffnen, erhalten Sie einen zirkulären Abhängigkeitsfehler, weil Sie eine Klasse referenzieren/öffnen, die gerade definiert wird. Daher müssen Sie sicherstellen, dass Sie zuerst die tatsächliche Klasse des Motors laden.

# 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 

In meinem Fall bin ich mit dem Blazer Juwel und das Hinzufügen von Authentifizierung zu. Da ich eine deklarative Autorisierung verwende, die der Blazer nicht direkt unterstützt, muss ich Blazers Basis-Controller öffnen und meine Autorisierungsanforderung hinzufügen.

+1

Dies sollte die akzeptierte Antwort sein, da es ein Beispiel dafür gibt, was das OP verlangt, und verwendet das Format, das die Dokumente im Schienenhandbuch vorschlagen. – dft

Verwandte Themen