Rails 5: Как отправить форму с помощью пользовательских заголовков HTTP?
Я не могу найти какую-либо информацию о том, как получить веб-форму в Rails 5 для отправки с помощью настраиваемых заголовков. Я бы хотел, чтобы URL-адрес, по которому я отправляю запрос PUT, также получаю некоторые пользовательские заголовки. Я удивлен, что для form_for нет аргументов.
Я мог бы выполнить это, отправив форму в действие, где я изменяю заголовки там, например, request.headers['my-header'] = 'xyz'
. Тогда мне пришлось бы сделать запрос PUT
из этого "среднего" действия контроллера, и я чувствую, что этот дополнительный шаг неуклюж и нетрадиционен.
Я мог бы также использовать jQuery для привязки к клику submit и отправить данные формы после добавления заголовков через JavaScript. Идентификатор скорее не включает в себя другой уровень (то есть JS) в этом процессе.
Я тоже не хочу этого делать. Есть ли способ, которым я могу просто использовать помощники формы Rails (или некоторый помощник контроллера), чтобы добавить некоторые пользовательские заголовки в запрос, сделанный приложением формы?
Ответы
Ответ 1
У Rails нет тегов, которые позволяют нам это делать, и поэтому не могут добавлять пользовательские заголовки к вашему запросу.
На самом деле вы не можете устанавливать пользовательские заголовки в форматах html без плагинов xhr,
Вы должны использовать его с ajax. Что-то вроде этого: -
<%= form_tag("/your_url", method: :post, :remote => true, :html => { id: "form-id" }) do |f| %>
...your form here...
<% end %>
а затем вы 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;
});
Использование только remote: true в rails будет делать ajax-вызов, но вы хотите, чтобы его можно было настроить, используя код выше.
Ответ 2
Браузер будет отправлять только стандартные заголовки, такие как файлы cookie, contenttype и т.д. Вы не можете отправить заголовок авторизации (или другой пользовательский), используя форму HTML-формы. Вы должны использовать AJAX для этого.
Ответ 3
$("#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 elements.
success: function(data)
{
alert(data); // show response from the PHP скрипт.
}
});
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 %>