Verwenden von Rails link_to für Links, die Beiträge verfassen

83

Ich habe einen Link, mit dem ich eine Post-Anfrage senden muss. Normalerweise würde ich jQuery verwenden und das Standardverhalten des Links verhindern und dann ein Formular an das Ziel senden. Dies scheint etwas zu sein, bei dem Rails mir helfen sollte. Sicher genug, die link_toMethode hat eine Option zum Angeben einer POST-http-Methode:

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

Das funktioniert, aber ich muss auch 2 Parameter hinzufügen. Ich habe es versucht:

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

Das hat diese Parameter nur zum <a>HTML-Element hinzugefügt , diese aber beim Klicken auf den Link nicht übermittelt:

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

Gibt es eine Möglichkeit, eine POST-Anforderung mit Parametern mithilfe link_toeiner anderen Rails-Methode auszuführen? Ich benutze Rails 3.2.9.

beim.
quelle
Ich glaube nicht, dass du das kannst. wahrscheinlich am besten in Ihrem Controller mit net / http oder HTTParty?
Mike Campbell
In meinem Controller ist dies nicht möglich. Der Benutzer muss auf die andere Site geleitet werden. Sieht so aus, als hätten Sie Recht, es gibt keinen eingebauten Link-Mechanismus, der dies für mich erledigt.
um.

Antworten:

139

Die kurze Antwort lautet: Wenn Sie unter "Parametern" Formularfelder verstehen, können Sie dies einfach nicht tun (zumindest nicht auf eine einfache Weise, die ich sehen kann). Sie sollten stattdessen ein Formular mit einer Senden-Schaltfläche verwenden, das so gestaltet ist, dass es wie ein Link aussieht (wenn Sie möchten, dass es so aussieht).

Wenn Sie andererseits Abfrageparameter gemeint hätten , würde dies funktionieren:

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post
Chris Salzberg
quelle
1
Ich habe gerade meine Frage aktualisiert und verwende tatsächlich eine externe URL für diese Links.
um.
Ich habe einen Hinweis hinzugefügt, der besagt, dass das, was Sie tun möchten, über einen Link nicht möglich ist. Sie benötigen ein Formular mit einer Senden-Schaltfläche.
Chris Salzberg
3
Es ist wichtig zu beachten, dass, wenn ein Benutzer Javascript deaktiviert hat, der Link standardmäßig eine "GET" -Anforderung enthält.
bkunzi01
8

Sie können Parameter in der URL folgendermaßen codieren:

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

Wenn es nicht Ihren Anforderungen entspricht, verwenden Sie besser ein Formular als ein link_to.

Adrien Coquio
quelle
Dies ist in der Tat eine sehr schöne Möglichkeit, die Parameter hinzuzufügen.
Nathanvda
Funktioniert nicht für meine Bedürfnisse, die Parameter müssen POST-Parameter sein. Aber danke, ich wusste nichts über die to_param-Methode. Sie benötigen auch ein ?After-Profil.
um.
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.
Adrien Coquio
1
Ungeachtet dessen, dass dies die Frage des OP nicht beantwortet, sollten Sie dafür einen URL-Helfer verwenden, wie in @ shioyamas Antwort
Ben West
@ BenWest: Der Helfer wurde ursprünglich nicht verwendet und ich nahm an, dass er sinnvoll war (es könnte zum Beispiel eine externe URL gewesen sein)
Adrien Coquio
2

Beachten Sie, dass, wenn der Benutzer JS deaktiviert hat oder Sie die unauffälligen JS-Bibliotheken entfernt haben, die standardmäßig enthalten sind, link_todiese stillschweigend über eine GETAnforderung gesendet werden .

Im Allgemeinen mag ich keine Links, die POSTAnfragen ausführen . Ich denke, das ist die Rolle eines Formulars und eines Knopfes.

Eine einfache (und sicherere) Alternative ist daher die Verwendung des Rails button_to- Helfers:

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

button_tounterstützt auch die methodOption, aber da sie standardmäßig verwendet wird, posthabe ich sie einfach weggelassen.

Kostas Rousis
quelle
Einverstanden mit Kostas. Darüber hinaus funktioniert link_to mit Methodenbeitrag im Internet Explorer nicht gut.
Pierre-Yves O.
1

Um Daten zu POSTEN, benötigen Sie ein Formular. Sie benötigen jedoch keine Schaltfläche zum Senden. 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 sendet. Im folgenden Beispiel ist die POST-Ressource nur eine REST-Aktion, für die keine Felder erforderlich sind, sodass keine Steuerelemente für die Formulareingabe vorhanden sind. Wenn Sie einige Daten veröffentlichen möchten, fügen Sie einfach versteckte Eingabefelder in das Formular ein.

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

Dem Formular wird eine Klasse zugewiesen, damit Sie es über CSS formatieren oder ausblenden können (z. B. 'display: inline').

Munition Göttsch
quelle
1

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

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