1

リクエストヘッダートークンを設定しようとすると、エラーが発生します。

ActionController::RoutingError (No route matches [OPTIONS] "/data"):

これがajax呼び出しです:

  $.ajax({
    url: this.hostName + url,
    type: 'POST',
    data: data,
    dataType: 'json',
    beforeSend: function( xhr ) {
      xhr.setRequestHeader( 'X-CSRF-Token', $( 'meta[name="csrf-token"]' ).attr( 'content' ) );
    },
    success: function(response) {
      console.log('success');
      console.log(response);
    },
    error: function(response) {
      console.log('error');
      console.log(response);
    }
  });

リクエストヘッダーを省略した場合:

Started POST "/data" for 127.0.0.1 at 2012-07-24 18:37:22 -0700

しかし、次のような警告が表示されます。

WARNING: Can't verify CSRF token authenticity

なぜこれが起こっているのかについてのアイデアはありますか?

4

2 に答える 2

1

やってみました

$.ajax({
    url: this.hostName + url,
    type: 'POST',
    headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }
    data: { param : 'something' },
    dataType: 'json'
});

そして、あなたのコントローラーでparams [:param]はあなたに「何か」を与えるでしょう。

X-CSRF-Tokenのすべてが必要な理由を知りたい場合は、これをお読みください。基本的に、Railsはアプリケーションを安全に保つために、そのトークンをページに自動的に含めます。サイトのいずれかのページを調べると、HTMLドキュメントの先頭に次のようなものが表示されます。

<meta content="guma1QdmO9Tn9SB4yV4DonkY4xf4Sy6lIvrFyHIaR1U=" name="csrf-token">

これは、ファイル<%= csrf_meta_tags %>に含まれている行によって作成されapplication.html.erbます。

Railsは、このトークンを通常の非GETリクエストに自動的に含めて、安全に保ちます。ただし、javascriptとajaxを使用する場合は、jQuery関数を使用してDOMでトークンを検索することにより、これを手動で行う必要があります$('meta[name="csrf-token"]'

現在、リクエストを行うたびにそのトークンを検索しているため、これはあまり効率的ではありません。したがって、あなたがすべきことは、次のようにajaxSetupを使用することです。

$.ajaxSetup({
    type: 'POST',
    headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }
    dataType: 'json'
});

そして今、あなたがリクエストを送りたいときはいつでも、あなたが必要とするのはこれだけです:

$.ajax({
    url: this.hostName + url,
    data: { param : 'something' }
});

編集:ああ、なるほど。あなたがするときあなたは何を得るのですalert(this.hostName + url)か?そして、どのようにルートを宣言していますか?私の記憶が正しければ、絶対URLの代わりに相対URLを使用できるので、ルート部分は必要ありません。次に例を示します。

# routes.rb
post "relative_url" => 'controller#action'

# file.js
$.ajax({
    url: "relative_url",
    data: { param : 'something' }
});
于 2012-07-25T04:52:12.367 に答える
0

ajaxでは絶対URLではなく相対URLを指定してみてください。私は同じ問題を抱えていて、URLを変更して作業しました

于 2017-08-16T17:29:14.177 に答える