2

RailsでDeviseを使用していて、 sign_out関数を設定しているときにエラーが発生しました。気付いたのは、sign_outリンクのあるページがレイアウトをスキップしたため、Javascriptが非アクティブだったためです。次のコマンドでJavaScriptを有効にする: `

<%= javascript_include_tag :defaults %>

すべてがうまくいきました。

なぜそれがそのように機能するのですか?

4

2 に答える 2

4

リンクは(通常)常にリクエストを取得します。リンクが非getリクエストを送信するには、リンクの動作を変更するjavascriptが必要です。

さらに、ブラウザは通常GET / POSTリクエストのみをサポートするため、railsは投稿に_methodフィールドを追加することで、他のメソッド(DELETE、PUT、...)を偽造します。

于 2012-06-05T11:53:13.783 に答える
2

これがからの抜粋ですjquery_ujs.js。それがどのように行われるかについていくらかの光を当てるでしょう:

// Handles "data-method" on links such as:
// <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a>
handleMethod: function(link) {
  var href = link.attr('href'),
    method = link.data('method'),
    target = link.attr('target'),
    csrf_token = $('meta[name=csrf-token]').attr('content'),
    csrf_param = $('meta[name=csrf-param]').attr('content'),
    form = $('<form method="post" action="' + href + '"></form>'),
    metadata_input = '<input name="_method" value="' + method + '" type="hidden" />';

  if (csrf_param !== undefined && csrf_token !== undefined) {
    metadata_input += '<input name="' + csrf_param + '" value="' + csrf_token + '" type="hidden" />';
  }

  if (target) { form.attr('target', target); }

  form.hide().append(metadata_input).appendTo('body');
  form.submit();
},

DELETEしたがって、このようなリンクをクリックすると、基本的に、 HTTP動詞をシミュレートするいくつかのパラメーターを使用して、非表示のフォーム(クリック中に作成される)の送信がトリガーされます。

于 2012-06-05T12:28:31.277 に答える