2017-02-02 19 views
14

Я не могу найти какую-либо информацию о том, как получить веб-форму в Rails 5 для отправки с помощью настраиваемых заголовков. Я бы хотел, чтобы URL-адрес, по которому я отправляю запрос PUT, также получаю некоторые пользовательские заголовки. Я удивлен, что для этого нет аргумента для form_for.Rails 5: Как отправить форму с помощью пользовательских заголовков HTTP?

Я мог бы выполнить это, отправив форму в действие, где я изменяю заголовки там, например, request.headers['my-header'] = 'xyz'. Тогда я должен был бы сделать запрос PUT из этого «среднего» действия контроллера, и я чувствую, что этот дополнительный шаг неуклюж и нетрадиционен.

Я мог бы также использовать jQuery для привязки к сообщению отправки и отправить данные формы после добавления заголовков через JavaScript. Идентификатор скорее не включает в себя другой уровень (то есть JS) в этом процессе.

Я бы тоже не хотел этого делать. Есть ли способ, которым я могу просто использовать помощники формы Rails (или какой-либо помощник контроллера), чтобы добавить некоторые пользовательские заголовки в запрос, сделанный приложением формы?

+0

Почему вы хотите, чтобы послать заголовок НТТР с формой? Что вы пытаетесь архивировать? – spickermann

+2

@spickermann действительно, ответ «все, что я хочу» - почему мне не нужно отправлять пользовательские заголовки? Я мог подумать о многих причинах. В этом конкретном случае я пытаюсь отправить заголовки токенов на предъявителя API, который требует их аутентификации. – Todd

+0

У нас есть два заголовка, которые нам нужно установить: «Xmlrpc-Token» и «Token». Как мы можем установить их из form_for? –

ответ

6

У Rails нет тегов, которые позволяют это сделать, и поэтому не могут добавлять пользовательские заголовки в ваш запрос.

На самом деле вы не можете устанавливать пользовательские заголовки в форматах html без плагинов xhr, Вы должны использовать его с ajax. Что-то вроде этого: -

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

, а затем вы Аякса код: -

$('#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; 
}); 

Использование только удаленный: правда в рельсах будет делать Ajax вызов, но вы хотите, чтобы иметь возможность настроить его с помощью кода выше.

+0

Нет, тег формы не просто создает тег формы. Когда {remote: true}, Rails создает тег формы HTML, а также предоставляет javascript для получения значений из формы и создания вызова AJAX.Поэтому я искал некоторый параметр метода меток формы, чтобы сообщить Rails включить настройку настраиваемого заголовка, когда он вызывает вызов AJAX. –

+0

Правильно, исправит ответ, его немного больше, чем просто конвертирование в теги html. Но чтобы ответить на ваш вопрос, нет возможности добавлять заголовки, используя теги rails. Альтернативой является использование js. Использование только remote: true не позволит вам настраивать заголовки запросов. Для этого вам нужно отключить это поведение (используя return false в коде выше) и отправить его с помощью собственной функции отправки. – rohan

2

Браузер отправляет только стандартные заголовки, такие как файлы cookie, contenttype и т. Д. Вы не можете отправить заголовок авторизации (или другой пользовательский), используя форму HTML-формы. Вы должны использовать AJAX для этого.

+0

Он не работает с 'remote: true', который использует AJAX. –

+0

, так что вы можете использовать: https://github.com/rails/jquery-ujs/wiki/ajax, $ ('# your_form'). On ('ajax: beforeSend', функция (событие, данные, статус, xhr) { // Добавить заголовки }); –

+0

Ну, с 'remote: false' Rails только строит < форму > тег, который не будет устанавливать заголовки. С 'remote: true' вы говорите, что Rails этого не сделает, но без уважительной причины. –

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

Спасибо, но я думаю, что все знают, что это можно сделать с помощью javascript. Вопрос заключался в том, может ли это быть достигнуто с помощью помощника формы Rails. – Todd