2016-07-11 8 views
0

Dies könnte eine seltsame Frage sein, und schwer das Thema in einem Klappentext Titel zu vermitteln, aber hier geht:Vorschläge zur Verwendung des ActiveRecord-Modells/Controllers ohne Speichern eines Datensatzes?

Ich habe eine einfache Rails App, die eine Reihe von Informationen speichert. Benutzer können Berichte erstellen, um Informationen zu extrahieren, die ihnen wichtig sind - es gibt ein "Bericht" -Modell, Validierungen werden ausgeführt und diese Berichte werden gespeichert. Wenn ein Bericht ausgeführt wird, wird @report an eine Berichtsmethode gesendet, die Informationen werden abgerufen und gerendert.

Aber jetzt möchte ich eine Ad-hoc-Reporting-Funktion erstellen, die den Bericht nicht speichert - die App sollte die Berichtsparameter akzeptieren, validieren und dann sofort den Bericht ausführen, alles ohne zu speichern.

Um dies zu tun, habe ich versucht, meine vorhandene neue/bearbeiten Formular zu verwenden, ich habe eine ad_hoc Methode erstellt, die @ report.new (report_params), ruft die Modellvalidierungen, und dann versucht zu rendern: Berichterstattung @report. usw. Ich werde ein wenig Fortschritte machen, aber dann in eine neue Straßensperre einlaufen.

Bevor ich einen Code schreibe, der Hilfe zu einem bestimmten Thema sucht, möchte ich ein Feedback über den besten Ansatz für diese Art von Ad-hoc-Berichterstattung erhalten. Irgendwelche Vorschläge?

Zusammenfassend möchte ich:

  • haben eine Ad-hoc-Formular, das auf meine neue/bearbeiten Form
  • Gebrauch, bevor die identisch sieht die Modellvalidierungen Ich habe (dafür, dass das Startdatum ist Enddatum usw.)
  • haben sie einen Bericht Lauf unmittelbar nach der Validierung/Unterwerfung

ich weiß, ich könnte eine hacky-Version zu tun, wo einige Berichte als ad-hoc-markiert sind, verstecken sie in der Benutzeroberfläche und haben eine ra ke Aufgabe lösche diese usw. Aber gibt es eine elegante Herangehensweise, die ich vermisse?

Antwort

0

Hier ist, was ich würde wahrscheinlich tun:

#reports_controller.rb 
def adhoc_checker 
    @report = Report.new(report_params) 
    if @report.valid? 
    @report.run 
    # render it to view or something, redirect may not be your friend here because report isn't persisted 
    else 
    # inform the user that report isn't valid, send valid report 
    end 
end 

#report.rb 
def run 
    # perform the operations you want to perform here 
end 

Dies sollte funktionieren, weil AR#valid? Methode, um die Validierung und Berichte läuft, wenn sie gültig sind. Diese Methode wird ausgeführt, bevor Ihr Modell gespeichert wird.

Lassen Sie mich wissen, ob das hilft oder andere Abklärungen

+0

Danke für die schnelle Antwort, oreoluwa. Ich bin ziemlich weit gekommen mit der Methode, die Sie vorgeschlagen haben, aber wo ich zusammenarbeite ist mit dem Formular zu übermitteln. Rails möchte, dass es zur "create" -Methode und nicht zu meiner ad_hoc-Methode geht - ich habe viele Routen optimiert, das Formular aktualisiert, um die zu verwendende URL oder Aktion zu spezifizieren, usw., ohne viel Verbesserung (das Beste, was ich bekam war versuchte es zu senden, um es zu löschen!). – user2454099

+0

Die Tatsache, dass ich diese Probleme hatte, und dass es notwendig erscheint, eine andere Form zu verwenden (mehr oder weniger meine andere zu kopieren), so dass ich versuchen konnte, spezifische Aktionen zu spezifizieren, brachte mich dazu, zu denken, dass ich nicht den richtigen Ansatz benutzte . – user2454099

+0

Vielleicht sollte ich aus der Not eine Tugend machen und der Create-Methode Logik hinzufügen, um diesen Anwendungsfall zu behandeln. Hmmmm .... – user2454099

0

Aber gibt es eine elegante Annäherung an das ich fehle?

Ja, es sollte einfach sein, die Funktionalität zu wechseln, je nachdem, ob es sich um einen "Ad-hoc" -Bericht handelt oder nicht.

Sie haben den UX für den Ad-hoc-Bericht nicht erläutert. Wenn Sie ein Kontrollkästchen (zum Beispiel) haben, können Sie etwas tun wie:

def create 
    if params[:ad_hoc] 
    ... 
    else 
    # send report to reporting method 
    end 
Verwandte Themen