2014-01-25 5 views
7

In meiner App können einige Ressourcen nicht zerstört werden. Also schrieb ich mein Modell wie folgt aus:Kann ich eine Flash-Nachricht im aktiven Admin haben, wenn das Löschen fehlgeschlagen ist?

before_destroy :destroy_check 
def destroy_check 
    if some_reason? 
    errors.add(:base, 'cannot destroy this resource!') 
    end 
    errors.blank? 
end 

Dann, als ich zerstören klicken in ActiveAdmin, gibt es nichts zu zeigen: kein Fehler, keine Nachricht, und der Datensatz nicht wirklich zerstört wird. Wie kann ich eine Fehlermeldung anzeigen, wenn das Zerstören fehlschlägt?

Antwort

8

Zuerst Ihr Modells before_destroy Rückruf verwenden, wenn das Protokoll zu überprüfen kann zerstört werden (hier, wenn ein Student angemeldet ist):

Es ist c ommon und einfach und Sie tun es für jedes Modell, das Sie wollen.

Und hier ist ein Trick. Sie können einen allgemeinen Patch für alle Active-Admin-Ressourcen anwenden, um die Fehlernachricht Ihres Modells an den Benutzer als Rückruf ResourceController zu übergeben. Es ist die check_model_errors Methode unten. Und diese Methode muss als Callback während der Ausführung des Methodenaufrufs jeder Ressource ActiveAdmin.register registriert werden (siehe Patch run_registration_block). Sie können den folgenden Code einfach in eine neue Datei (beliebigen Namens) in den Ordner config/initializers Ihrer App einfügen (oder in einen anderen Ordner, der beim Start der App initialisiert wird). Ich stelle es als config/initializers/active_admin_patches.rb.

class ActiveAdmin::ResourceController 
    def check_model_errors(object) 
     return unless object.errors.any? 
     flash[:error] ||= [] 
     flash[:error].concat(object.errors.full_messages) 
    end 
end 
class ActiveAdmin::ResourceDSL 
    alias_method :old_run_registration_block, :run_registration_block 
    def run_registration_block(&block) 
    old_run_registration_block(&block) 
    instance_exec { after_destroy :check_model_errors } 
    end 
end 
+1

Das zweite Bit des Codes hier scheint Schienen automatisch für mich zu laden? Wenn ich den Code ändern und schlagen jede Seite, die ich die folgende Fehlermeldung erhalten 'undefined Methode 'controller' für nil: NilClass Extrahiert Quelle (um Zeile # 14): def run_registration_block (& ​​Block) old_run_registration_block (& ​​Block) instance_exec {after_destroy: check_model_errors} Ende' mit der Zeile instance_exec hervorgehoben. Passiert das für irgendjemand anderes? –

3

, wenn Sie eine Ressource sein wollen, das nicht aus dem aktiven Admin entfernt hat:

ActiveAdmin.register SomeModel do 
    controller do   
    def destroy 
     flash[:notice] = 'Cant delete this!' 
     redirect_to :back 
    end   
    end 
end 

oder löschen Aktionen:

ActiveAdmin.register SomeModel do 
    actions :all, except: [:destroy] 
end 
+0

zerstören Hinzufügen Funktion ist ok , Ich werde es versuchen.Ich kann nicht alle Aktionen zu zerstören, weil einige Ressourcen erlaubt zerstören, aber einige Ressourcen nicht erlaubt – WilliamZang

6

Ich fand diese in ActiveAdmin durch I18n Übersetzungen erreicht werden kann und die Responder Interpolation Options in der Steuerung anpassen.

Hinzufügen der Methode #interpolation_options zu ActiveAdmin :: Base in einem initializier:

# config/initializers/active_admin.rb 
class ActiveAdmin::BaseController 
    private 

    def interpolation_options 
    options = {} 

    options[:resource_errors] = 
     if resource && resource.errors.any? 
     "#{resource.errors.full_messages.to_sentence}." 
     else 
     "" 
     end 

    options 
    end 
end 

Dann überschreibt die Übersetzung für die zerstören Warnmeldung in den Lokalisierungs-Datei:

# config/locales/en.yml 
en: 
    flash: 
    actions: 
     destroy: 
     alert: "%{resource_name} could not be destroyed. %{resource_errors}" 
Verwandte Themen