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_to
metoda 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_to
lub jakiejkolwiek innej metody Railsów? Używam Railsów 3.2.9.
Odpowiedzi:
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
źródło
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
.źródło
?
profilu po.Zauważ, że jeśli użytkownik wyłączył JS lub usunąłeś dyskretne biblioteki JS, które są domyślnie dostarczane,
link_to
zostaną po cichu przesłane za pośrednictwemGET
żą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_to
obsługuje również tęmethod
opcję, ale domyślnie jestpost
tak, że właśnie ją pominąłem.źródło
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”)
źródło
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} %>
źródło