2016-06-12 5 views
0

Ich habe diesen Link in der Ansicht:Warum führt link_to eine Methode aus, wenn die Ansicht aufgerufen wird?

<%= link_to "Pay in PayPal", @order.paypal_url(edit_order_url, payment_notification_url), class: "btn btn-success" %> 

Und das im Modell:

class Order < ActiveRecord::Base 
def paypal_url(return_url, notify_url) 
    # ... Do stuff 
    self.update_attribute(:payment_in_process, true) 
    # Do more stuff...  
    end 



Als ich besuche die Ansicht, das Modell bekommen s sein Attribut aktualisiert. Ich will das nicht. Ich möchte nur, dass das Attribut aktualisiert wird, wenn auf die Verknüpfung geklickt wird.

Wissen, wie man das erreicht?

Antwort

1

Lassen Sie mich mit einem kurzen Überblick über link_to Methode beginnen. Nach api, diese Methode einen Link-Tag der name eine durch den Satz von options erstellt URL angegeben erstellt:

link_to(name = nil, options = nil, html_options = nil, &block) 

In Ihrem speziellen Fall ist die name „in PayPal bezahlen“, das eine einfache Zeichenfolge . Der zweite Parameter, URL, ist ein wenig komplizierter, da Sie nicht jede Art eines absoluten oder relativen Pfad zum Inhalt auf der Website übergeben, sondern statt dessen auf ein Objekt die Methode aufrufen:

@order.paypal_url(edit_order_url, payment_notification_url) 

Was passiert hier ist diese bestimmte Methode paypal_url wird sofort aufgerufen, und link_to erwartet diese Methode, um eine korrekte URL zurückzugeben. Das gleiche geschieht mit den bekannten Beispielen aus Dokumentation, z.B .:

link_to "Profile", profile_path(@profile) 
# => <a href="/profiles/1">Profile</a> 

Hier profile_path ist ein Verfahren, das ein Argument akzeptiert zu bekommen seine einzigartige id und damit einen richtigen Pfad erzeugen zu können. Es gilt die gleiche Regel: Diese Methode wird aufgerufen, sobald der Benutzer die Seite mit dem Link anfordert.

Also das erste Ding zu tun ist, alles zu entfernen, das mit Nachbearbeitung eines Klickens von paypal_url Methode in Verbindung steht.

Aber Sie wollen diese Dinge funktionieren, nachdem ein Link geklickt wurde. Tatsächlich wird in einer Controller-Schicht eine Entscheidung darüber getroffen, ob ein Benutzer auf eine Verknüpfung geklickt hat oder nicht. Einfach gesagt: Wenn eine Controller-Aktion aufgerufen wird, wissen Sie, dass ein Benutzer auf einen Link geklickt hat.

Also Schritt zwei ist, eine Art von Anfrage an Ihre innere Controller-Aktion zu machen und die zugehörigen Logiken dort zu platzieren. Falls paypal_url einen Benutzer zu Ihrer inneren Website-Seite führt, haben Sie wahrscheinlich diese Aktion bereits implementiert. Auf der anderen Seite, Ihre paypal_url könnte zu äußeren Seite führen, wie tatsächliche Paypal-Verarbeitung ... In diesem Fall könnten Sie das Gleiche mit Umleitung oder Ajax-Anfrage erreichen.

Verwandte Themen