55

Post ich habe einen Link, den ich eine Post-Anfrage mit senden müssen. Normalerweise würde ich jQuery verwenden und das Standardverhalten der Verbindung verhindern und dann ein Formular an das Ziel senden. Das scheint etwas zu sein, mit dem Rails mir helfen könnte. Sicher genug, hat die link_to Methode eine Option für eine POST http Methode angeben:Verwenden von Rails link_to für Links, die

link_to "Profile", 'http://example.com/profile', method: :post 

das funktioniert, aber ich brauche zu 2 Parameter hinzuzufügen. Ich habe versucht:

link_to "Profile", 'http://example.com/profile', method: post, param1: 'value1', param2: 'value2' 

Das ist nur die Parameter an das <a> HTML-Element hinzugefügt, aber nicht jene einreichen, wenn Sie den Link:

<a rel="nofollow" param1="value1" param2="value2" data-method="post" href="http://example.com/profile">Profile</a> 

Gibt es eine Möglichkeit, eine POST-Anfrage mit Parametern zu tun mit link_to oder einer anderen Rails-Methode? Ich benutze Rails 3.2.9.

+0

glaube nicht, dass du das kannst. Wahrscheinlich am besten in Ihrem Controller mit net/http oder HTTParty? –

+0

Kann es nicht in meinem Controller tun, Benutzer muss an die andere Seite gerichtet werden. Sieht so aus, als hättest du recht, aber dafür gibt es keinen integrierten Link-Mechanismus. –

Antwort

94

Die kurze Antwort ist, dass, wenn was Sie unter "Parameter" verstehen, Formularfelder sind, dann können Sie dies einfach nicht tun (zumindest nicht auf eine direkte Weise, die ich sehen kann). Sie sollten stattdessen ein Formular mit einer Übergabeschaltfläche verwenden, das so gestaltet ist, dass es wie ein Link aussieht (wenn es so aussieht, wie es aussehen soll).

Wenn auf der anderen Seite Sie Abfrage Parameter gemeint hätte, dann hätte diese Arbeit:

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post 
+1

Aktualisiert meine Frage, ich verwende tatsächlich eine externe URL für diese Links. –

+0

Ich habe eine Notiz hinzugefügt, die besagt, dass das, was Sie tun möchten, nicht über einen Link möglich ist. Sie benötigen ein Formular mit einer Senden-Schaltfläche. –

+2

Es ist wichtig zu beachten, dass wenn ein Benutzer JavaScript deaktiviert hat, der Link standardmäßig auf eine "GET" Anfrage wird. – bkunzi01

9

Sie Parameter in der URL auf diese Weise kodieren:

link_to "Profile", 'http://example.com/profile?' + {param1: 'value1', param2: 'value2'}.to_param, method: :post 

Wenn nicht passen Sie Ihre Bedürfnisse an Sie verwenden besser ein Formular als link_to.

+0

Dies ist in der Tat eine sehr schöne Möglichkeit, die Parameter hinzuzufügen. – nathanvda

+0

Funktioniert nicht für meine Bedürfnisse, die Parameter müssen POST-Parameter sein. Aber danke, ich wusste nichts von der to_param Methode. Sie benötigen auch ein '?' Nach-Profil. –

+0

Ok ich verstehe, dann denke ich, dass Sie ein Formular schreiben müssen. Sie können eine Hilfsmethode schreiben, die dieses Formular erstellt, wenn Sie diese Logik mehrmals wiederholen müssen. –

1

Um Daten POST zu senden, benötigen Sie ein Formular. Sie benötigen jedoch keine Absenden-Schaltfläche. Wenn Sie möchten, dass dies aus irgendeinem Grund wie ein Link aussieht, können Sie es tatsächlich zu einem Link machen, der das Formular über JavaScript übermittelt. Im folgenden Beispiel ist die POST-Ressource nur eine REST-Aktion, die keine Felder erfordert, daher gibt es keine Formulareingabesteuerelemente. Wenn Sie einige Daten posten möchten, legen Sie einfach versteckte Eingabefelder in das Formular.

<%= form_tag('http://something_postable', :method => :post, :class => 'internal') %></form> 
<%= link_to_function('Label for Link', 'previous("form").submit()', :title => 'Hover text for link') %> 

Die Form einer Klasse zugeordnet ist, so dass Sie es oder ausblenden über CSS-Stil (zB 'display: inline')

1

Die Parameter und die HTTP-Methode sollten zusammen {param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %> 
sein
0

Beachten Sie, dass link_to automatisch über eine GET Anfrage gesendet wird, wenn der Benutzer JS deaktiviert hat oder Sie die unauffälligen JS-Bibliotheken entfernt haben, die standardmäßig geliefert werden.

Im Allgemeinen bin ich nicht sehr gern mit Links, die POST Anfragen durchführen. Ich denke, das ist die Rolle eines Formulars und eines Knopfes.

So eine einfache (und sicherer) Alternative ist, die Schienen button_to Helfer zu verwenden:

button_to 'Profile', profile_path(@profile, param1: 'value1', param2: 'value2') 

button_to unterstützt auch die method Option, aber da es standardmäßig post so habe ich es einfach weggelassen.