Rails 5:表单如何使用自定义HTTP标头提交?

时间:2017-02-02 21:56:41

标签: ruby-on-rails webforms http-headers ruby-on-rails-5

我似乎无法找到有关如何在Rails 5中使用自定义标头提交webform的任何信息。我希望我发送PUT请求的URL也会收到一些自定义标头。我很惊讶form_for没有争论。

我可以通过将表单提交到我在其中修改标题的操作来完成此操作,例如request.headers['my-header'] = 'xyz'。然后我必须在这个“中间”控制器动作中发出PUT请求,我觉得这个额外的步骤是笨重和非传统的。

我还可以使用jQuery绑定到提交点击,并在通过JavaScript添加标题后提交表单数据。在这个过程中,我宁愿不涉及另一层(即JS)。

我不愿意这样做。有没有办法可以使用Rails表单帮助程序(或某些控制器帮助程序)为表单提交的请求添加一些自定义标题?

3 个答案:

答案 0 :(得分:7)

Rails没有任何标签可以让我们这样做,因此无法为您的请求添加自定义标头。

实际上,如果没有xhr插件,你不能在html表单中设置自定义标题,  你必须使用它与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:在rails中为true将进行ajax调用,但您希望能够使用上面的代码对其进行自定义。

答案 1 :(得分:2)

浏览器只会发送标准标题,如Cookie,contenttype等。您无法使用HTML表单提交发送授权标题(或其他自定义标题)。您应该使用AJAX来做到这一点。

答案 2 :(得分: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.
});