2017-02-02 16 views
14

Rails 5でカスタムヘッダーを使用して送信する方法についての情報はありません。いくつかのカスタムヘッダーを受け取るためにPUTリクエストを送信するURLを希望します。私はこのためにform_forの引数がないことに驚いています。Rails 5:フォームでカスタムHTTPヘッダーを送信する方法

私はそこにヘッダーを変更するアクションにフォームを送信することでこれを達成できます(例:request.headers['my-header'] = 'xyz')。私はこの "中"のコントローラアクションの中からPUTリクエストを作らなければならないだろう。そして、私はこの追加的なステップが不慣れであると感じている。

jQueryを使用して、送信クリックにバインドし、JavaScript経由でヘッダーを追加した後にフォームデータを送信することもできます。 Idでは、このプロセスでは別のレイヤー(つまりJS)は関係しません。

私はむしろどちらかをしません。フォームのヘルパー(またはコントローラヘルパー)を使用して、フォーム提出のリクエストにカスタムヘッダーを追加する方法はありますか?

+0

なぜあなたは、フォームにカスタムHTTPヘッダを送信したいですか?あなたは何をアーカイブしようとしますか? – spickermann

+2

@spickermann本当に、答えは "私が欲しいものは何でも" - なぜ私はカスタムヘッダーを送る必要がありますか?私は多くの理由が考えられます。この特定のケースでは、ベアラトークンヘッダーを認証に必要なAPIに送信しようとしています。 – Todd

+0

"Xmlrpc-Token"と "Token"を設定する必要があります。どのようにform_forからこれらを設定できますか? –

答えて

6

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; 
}); 

はリモート使用:真のレールでは、AJAX呼び出しを行いますが、あなたは、コードを使用してカスタマイズできるようにしたいです上記。

+0

いいえ、フォームタグは単にフォームタグを作成するだけではありません。 {remote:true}のとき、RailsはHTMLフォームタグを作成し、フォームから値を取得するためのjavascriptも提供し、AJAX呼び出しを行います。だから私は、AJAX呼び出しを行うときにカスタムヘッダーを設定するようにRailsに指示するために、フォームタグメソッドのパラメータを探していました。 –

+0

右は、答えを修正する、ちょうどちょうどhtmlタグに変換するよりも少し。しかし、あなたの質問に答えるために、railsタグを使ってヘッダーを追加する方法はありません。代わりにjsを使用することです。 remote:trueのみを使用すると、リクエストヘッダーをカスタマイズすることはできません。そのためには、上記のコードでfalseを返すことでその動作を無効にし、独自のsubmit関数を使用して送信する必要があります。 – rohan

2

ブラウザはCookie、contenttypeなどの標準ヘッダーのみを送信します.HTMLフォーム送信を使用してAuthorizationヘッダー(または他のカスタム)を送信することはできません。これを行うには、AJAXを使用する必要があります。

+0

AJAXを使用する 'remote:true'では動作しません。 –

+0

ですので、https://github.com/rails/jquery-ujs/wiki/ajax、$( '#your_form')。on( 'ajax:beforeSend'、function(イベント、データ、ステータス、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

関連する問題