2017-02-02 71 views
14

Nie mogę znaleźć żadnych informacji o tym, jak uzyskać formularz internetowy w Rails 5 do przesłania z niestandardowymi nagłówkami. Chciałbym, aby adres URL, do którego wysyłam żądanie PUT, również otrzymał niektóre niestandardowe nagłówki. Jestem zaskoczony, że nie ma dla tego argumentu za form_for.Szyny 5: Jak można przesłać formularz za pomocą niestandardowych nagłówków HTTP?

Mogłem to zrobić, przesyłając formularz do działania, w którym zmieniam tam nagłówki, np. request.headers['my-header'] = 'xyz'. Musiałbym wtedy wykonać żądanie w postaci "środkowej" kontrolera i uważam, że ten dodatkowy krok jest niekonsekwentny.

Mogę również użyć jQuery do powiązania z kliknięciem, które przesłałem, i wysłać dane formularza po dodaniu nagłówków za pomocą JavaScript. W tym procesie raczej nie należy angażować innej warstwy (tj. JS).

Wolałbym tego nie robić. Czy istnieje sposób, w jaki mogę po prostu użyć pomocników formularzy Railsów (lub jakiegoś pomocnika kontrolera) do dodania niestandardowych nagłówków do żądania złożonego przez formularz?

+0

Dlaczego chcesz wysłać niestandardowy nagłówek HTTP w formie? Co próbujesz zarchiwizować? – spickermann

+2

@spickermann naprawdę, odpowiedź brzmi "cokolwiek chcę" - dlaczego nie mam potrzeby wysyłania niestandardowych nagłówków? Mogłem wymyślić wiele powodów. W tym konkretnym przypadku próbuję wysłać nagłówki znaczników na okaziciela do interfejsu API, który wymaga ich uwierzytelnienia. – Todd

+0

Mamy dwa nagłówki, które musimy ustawić, "Xmlrpc-Token" i "Token". Jak możemy ustawić te z form_for? –

Odpowiedz

6

Railsy nie mają żadnych tagów, które nam to umożliwiają, a zatem nie mogą dodawać niestandardowych nagłówków do żądania.

W rzeczywistości nie można ustawić niestandardowych nagłówków w formularzach html bez wtyczek xhr, Musisz użyć go z ajaxem. Coś takiego: -

<%= form_tag("/your_url", method: :post, :remote => true, :html => { id: "form-id" }) do |f| %> 
    ...your form here... 
<% end %> 

a następnie kod ajax: -

$('#form-id').submit(function() { 
    var valuesToSubmit = $(this).serialize(); 
    $.ajax({ 
     type: "POST", 
     url: $(this).attr('action'), 
     data: valuesToSubmit, 
     headers: { 'Xmlrpc-Token': 'value' , 'Token': 'another_value'} 
    }).success(function(response){ 
     //success code 
    }); 
    return false; 
}); 

Korzystanie tylko zdalny: true w szynach sprawi wywołanie ajax, ale chcesz, aby móc dostosować go za pomocą kodu powyżej.

+0

Nie, znacznik formularza nie tworzy po prostu znacznika formularza. Kiedy {remote: true}, Rails tworzy znacznik formularza HTML, a także dostarcza javascript, aby pobrać wartości z formularza i wykonać wywołanie AJAX.Tak więc szukałem jakiegoś parametru do metody tagu formularza, aby poinformować Railsy o konieczności ustawienia niestandardowego nagłówka podczas wykonywania wywołania AJAX. –

+0

Dobrze, popraw odpowiedź, a to trochę więcej niż konwersja do tagów html. Ale aby odpowiedzieć na twoje pytanie, nie ma możliwości dodania nagłówków za pomocą tagu szyn. Alternatywą jest użycie js. Używając tylko remote: true nie pozwoli ci dostosować nagłówków żądań. W tym celu należy wyłączyć to zachowanie (używając zwrotu false w powyższym kodzie) i wysłać go przy użyciu własnej funkcji przesyłania. – rohan

2

Przeglądarka wyśle ​​tylko standardowe nagłówki, takie jak pliki cookie, typ zawartości itp. Nie można wysyłać nagłówka autoryzacji (lub innego niestandardowego) za pomocą formularza HTML. Do tego celu powinieneś użyć AJAX.

+0

Nie działa z opcją 'remote: true', która używa technologii AJAX. –

+0

, dzięki czemu można użyć: https://github.com/rails/jquery-ujs/wiki/ajax, $ ('# your_form'). On ("ajax: beforeSend", funkcja (zdarzenie, dane, stan, xhr) { // Dodaj nagłówki }); –

+0

Dobrze, z 'remote: false' Railsy po prostu budują tag < z postaci >, który nie ustawi nagłówków. Z 'remote: true' mówisz, że Rails nie zrobi tego, ale bez żadnego powodu. –

0

$("#idForm").submit(function(e) { 
 

 
    var url = "path/to/your/script.php"; // the script where you handle the form input. 
 

 
    $.ajax({ 
 
      type: "POST", 
 
      url: url, 
 
      data: $("#idForm").serialize(), // serializes the form's elements. 
 
      success: function(data) 
 
      { 
 
       alert(data); // show response from the php script. 
 
      } 
 
     }); 
 

 
    e.preventDefault(); // avoid to execute the actual submit of the form. 
 
});
<%= form_tag("/your_url", method: :post, :remote => true, :html => { id: "form-id" }) do |f| %> 
 
    ...your form here... 
 
<% end %>

$("#idForm").submit(function(e) { 
 

 
    var url = "path/to/your/script.php"; // the script where you handle the form input. 
 

 
    $.ajax({ 
 
      type: "POST", 
 
      url: url, 
 
      data: $("#idForm").serialize(), // serializes the form's elements. 
 
      success: function(data) 
 
      { 
 
       alert(data); // show response from the php script. 
 
      } 
 
     }); 
 

 
    e.preventDefault(); // avoid to execute the actual submit of the form. 
 
});

+0

Dzięki, ale myślę, że wszyscy wiedzą, że można to zrobić za pomocą javascript. Pytanie brzmiało, czy można to osiągnąć za pomocą pomocnika formularza Rails. – Todd