Używanie Railsów link_to dla linków, które publikują

85

Mam łącze, za pomocą którego muszę przesłać prośbę o wpis. Zwykle używałbym jQuery i zapobiegłbym domyślnemu zachowaniu linku, a następnie wysłałbym formularz do miejsca docelowego. Wygląda na to, że Railsy powinny mi w tym pomóc. Oczywiście link_tometoda ma opcję określenia metody http POST:

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

To działa, ale muszę też dodać 2 parametry. Próbowałem:

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

To właśnie dodało te parametry do <a>elementu HTML, ale nie przesłało ich po kliknięciu linku:

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

Czy istnieje sposób na wykonanie żądania POST z parametrami przy użyciu link_tolub jakiejkolwiek innej metody Railsów? Używam Railsów 3.2.9.

w.
źródło
nie myśl, że możesz to zrobić. chyba najlepiej zrobić to na swoim kontrolerze z net / http lub HTTParty?
Mike Campbell
Nie mogę tego zrobić w moim kontrolerze, użytkownik musi zostać przekierowany do innej witryny. Wygląda jednak na to, że masz rację, nie ma wbudowanego mechanizmu linku, który mógłby to zrobić za mnie.
godz.

Odpowiedzi:

143

Krótka odpowiedź jest taka, że ​​jeśli przez „parametry” masz na myśli pola formularza, to po prostu nie możesz tego zrobić (przynajmniej nie w prosty sposób, jaki widzę). Zamiast tego powinieneś użyć formularza z przyciskiem przesyłania, stylizowanym na link (jeśli tak ma wyglądać).

Jeśli z drugiej strony miałeś na myśli parametry zapytania , to zadziałałoby:

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post
Chris Salzberg
źródło
1
Właśnie zaktualizowałem moje pytanie, w rzeczywistości używam zewnętrznego adresu URL dla tych linków.
godz.
Dodałem notatkę mówiącą zasadniczo, że to, co chcesz zrobić, nie jest możliwe za pomocą linku. Potrzebujesz formularza z przyciskiem przesyłania.
Chris Salzberg
3
Ważne jest, aby pamiętać, że jeśli użytkownik wyłączył obsługę JavaScript, link będzie domyślnie wskazywał żądanie „GET”.
bkunzi01
8

Możesz zakodować parametry w adresie URL w ten sposób:

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

Jeśli nie odpowiada Twoim potrzebom, lepiej użyj formularza niż pliku link_to.

Adrien Coquio
źródło
To naprawdę bardzo fajny sposób na dodanie parametrów.
nathanvda
Nie działa na moje potrzeby, parametry muszą być parametrami POST. Ale dzięki, nie wiedziałem o metodzie to_param. Potrzebujesz również ?profilu po.
godz.
Ok, rozumiem, myślę, że musisz napisać formularz. Możesz napisać metodę pomocniczą, która zbuduje ten formularz, jeśli będziesz musiał powtórzyć tę logikę kilka razy.
Adrien Coquio
1
Pomimo tego, że to nie odpowiada na pytanie OP, powinieneś użyć do tego pomocnika adresu URL, jak w odpowiedzi @ shioyama
Ben West
@BenWest: pomocnik nie był początkowo używany i założyłem, że ma znaczenie (na przykład mógł to być zewnętrzny adres URL)
Adrien Coquio,
3

Zauważ, że jeśli użytkownik wyłączył JS lub usunąłeś dyskretne biblioteki JS, które są domyślnie dostarczane, link_tozostaną po cichu przesłane za pośrednictwem GETżądania.

Ogólnie rzecz biorąc, nie przepadam za linkami, które wykonują POSTżądania. Myślę, że taka jest rola formularza i przycisku.

Zatem łatwą (i bezpieczniejszą) alternatywą jest użycie helpera Rails button_to :

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

button_toobsługuje również tę methodopcję, ale domyślnie jest posttak, że właśnie ją pominąłem.

Kostas Rousis
źródło
Uzgodniono z Kostasem. Ponadto link_to z metodą post nie działa dobrze w przeglądarce Internet Explorer.
Pierre-Yves O.
1

W celu POST danych potrzebny jest formularz. Nie potrzebujesz jednak przycisku przesyłania. Jeśli z jakiegoś powodu chcesz, aby to wyglądało jak łącze, możesz w rzeczywistości uczynić z niego łącze, które przesyła formularz za pomocą JavaScript. W poniższym przykładzie zasób POST jest po prostu akcją REST, która nie wymaga żadnych pól, więc nie ma żadnych formantów wprowadzania formularza. Jeśli chcesz opublikować jakieś dane, po prostu umieść w formularzu ukryte pola wejściowe.

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

Formularz ma przypisaną klasę, więc możesz ją stylizować lub ukryć za pomocą CSS (np. „Display: inline”)

Ammo Goettsch
źródło
1

Parametry i metoda http powinny być razem {param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>
pangpang
źródło