So fügen Sie zusätzliche Formularfelder außerhalb des Formulardeklarationsblocks hinzu

9

Das Hauptziel: Erlaube Plugins, Edelsteine, vordefinierten Formularen zusätzliche Formularfelder hinzuzufügen.

Zum Beispiel hat die Anwendung ein Anmeldeformular für Geräte: %pr_e%

Marketingabteilung möchte eine Kampagne für die nächsten 2 Tage starten (zB: Registrieren Sie sich mit einem Aktionscode und erhalten Sie X Bonuspunkte). Daher müssen wir allen unseren Registrierungsformularen ein zusätzliches Feld promo code hinzufügen.

Gibt es eine Möglichkeit, ein zusätzliches Feld zum Formular von meinem Rails-Plugin / Railtie hinzuzufügen, und definieren Sie eine on_submit Callback-Methode (um Maßnahmen für meine zusätzlichen Felddaten zu ergreifen)?

Vorteile:

  • es ermöglicht das Entfernen der Funktionalität in 2 Tagen oder einer Woche, indem Sie sie einfach aus der Gem-Datei entfernen
  • garantieren, dass die Funktionalität der Kern-Site nicht beeinträchtigt wird, sondern einfach auf die ursprüngliche Funktionalität zurückgreift
  • garantieren, dass ein Entwickler keinen Code irgendwo in der Hauptapp
  • hinterlassen hat
  • plugin / railtie kümmert sich um das Speichern / Aktualisieren von Daten, die dazu gehören

Ich habe mir ActionView-Code angeschaut, und es scheint, dass es keine eingebaute Methode dafür gibt. Was sind deine Gedanken?

HINWEIS: Drupal form_alter Haken sind ein großartiges Beispiel.

    
Uzbekjon 08.02.2012, 16:12
quelle

3 Antworten

2

Zunächst ist Ihre Idee, diesen Code in einem Juwel / Railtie / Motor zu isolieren, ausgezeichnet. Ich denke, deine beste Wette ist, Affen die form_for-Methode zu patchen und in das Extra-Feld zu stecken. In Bezug auf den Trigger bei der Einreichung, wenn Sie sich auf Rails 3.1 befinden und die Asset-Pipeline verwenden, können Sie den Edelstein auch Javascript geben lassen, obwohl dies eine kleine Änderung in Ihrem application.js erfordern würde, um die js-Datei des Edelsteins zu benötigen. z.B require 'promo/application.js , wenn der Edelstein "Promo" genannt wurde.

Sehen Sie sich die Dokumentation für an Angepasster Formular-Generator

Hier ist eine ungefähre Idee, wie das funktionieren könnte, obwohl ich diesen Code nicht ausprobiert habe. Ich würde dies in die promo.rb-Datei, die Unterklassen Railtie oder Engine .

%Vor%

Hinunter die Straße, besonders. Wenn Ihre Marketingabteilung möglicherweise mehr Kampagnen ausführt, möchten Sie vielleicht sogar die Formulare der App ändern, um auf einen bestimmten Builder zu verweisen, den Sie von einem Juwel überschreiben können, ohne dass der Affe hier patchen muss.

    
Wolfram Arnold 22.02.2012 03:54
quelle
1

Idee in Schritten:

1) Definieren Sie ein Modell wie AdditionalField (ID, Feldname, Feldtyp, Standardwert, is_required)

2) dann erstellen Sie eine Funktion wie:

%Vor%

3) dann können Sie über die gefundenen AdditionalFields iterieren und die richtigen Feldtypen nach Bedarf erstellen.

Ich verwendete diese Lösung für eine Vergleichswebsite, wo sie die Fragebögen für jeden unterschiedlichen Vergleichstyp konfigurieren mussten.

Hier ist der Rendercode, den ich verwendet habe. Sie müssen ihn entsprechend Ihrer Situation anpassen. Beziehungen sind:

%Vor%

FragenHelper

%Vor%

Controller

%Vor%     
TomDunning 17.02.2012 14:15
quelle
0

In diesem Fall sollte ein neues Juwel erstellt werden, das -

  1. Fügen Sie promo_code dem Benutzermodell hinzu und machen Sie es zugänglich
  2. Überschreibt das Geräteformular, um die Eingabe des Promo-Codes zu übernehmen (kopiere einfach das Formular "Einfügen" und füge das Promo-Feld hinzu)
  3. Fügen Sie die erforderlichen Validierungen & amp; zusätzliche Verarbeitung (Rückrufe) innerhalb des Benutzermodells (Metaprogrammierung der Benutzerklasse)

Wir machen keine Änderungen in der Hauptanwendung, daher sind wir sicher.

    
Sandip Ransing 24.02.2012 08:23
quelle