wake-up-neo.net

Verwenden Sie Rails link_to für Links, die posten

Ich habe einen Link, mit dem ich eine Post-Anfrage einreichen muss. Normalerweise würde ich jQuery verwenden und das Standardverhalten des Links verhindern und dann ein Formular an das Ziel senden. Dies scheint, als könnte Rails mir helfen. Sicher genug, die link_to - Methode 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'

Dadurch wurden diese Parameter dem HTML-Element <a> Hinzugefügt, aber beim Klicken auf den Link nicht gesendet:

<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 unter Verwendung von link_to Oder einer anderen Rails - Methode durchzuführen? Ich benutze Rails 3.2.9.

77
at.

Die kurze Antwort lautet: Wenn Sie mit "Parameter" Formularfelder meinen, 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, die so gestaltet ist, dass sie wie ein Link aussieht (wenn Sie dies wünschen).

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

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post
127
Chris Salzberg

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

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

Wenn es nicht Ihren Bedürfnissen entspricht, verwenden Sie besser ein Formular als ein link_to.

8
Adrien Coquio

Beachten Sie, dass, wenn der Benutzer JS deaktiviert hat oder Sie die unauffälligen JS-Bibliotheken entfernt haben, link_to wird stillschweigend über eine GET Anfrage übermittelt.

Im Allgemeinen mag ich keine Links, die POST Anfragen ausführen. Ich denke, das ist die Rolle eines Formulars und einer Schaltfläche.

Daher ist es eine einfache (und sicherere) Alternative, den Helfer Rails button_to zu verwenden:

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

button_to unterstützt auch die Option method, aber da die Standardeinstellung post ist, habe ich sie gerade weggelassen.

2
Kostas Rousis

Um POST Daten zu erhalten, benötigen Sie ein Formular. Sie benötigen jedoch keinen Senden-Button. Wenn dies aus irgendeinem Grund wie ein Link aussehen soll, können Sie es tatsächlich zu einem machen Link, der das Formular über JavaScript sendet. Im folgenden Beispiel handelt es sich bei der POST Ressource nur um eine REST Aktion, für die keine Felder erforderlich sind, sodass kein Formular vorhanden ist Eingabesteuerelemente: Wenn Sie einige Daten veröffentlichen möchten, fügen Sie einfach ausgeblendete 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 ist eine Klasse zugewiesen, damit Sie es über CSS formatieren oder ausblenden können (z. B. "display: inline").

2
Ammo Goettsch

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} %>
1
pangpang