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 %>