2

我在 Rails 中使用 Devise,在设置sign_out函数时遇到了错误。我注意到,发生这种情况是因为具有 sign_out 链接的页面跳过了布局,因此 Javascript 处于非活动状态。通过启用javascript:`

<%= javascript_include_tag :defaults %>

一切正常。

为什么它会这样工作?

4

2 回答 2

4

链接(通常)总是得到请求。为了让链接发送非获取请求,您需要一些 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();
},

因此,通过单击这样的链接,您基本上触发了隐藏表单(在单击期间创建)的发送,其中包含一些模拟DELETEHTTP 动词的参数。

于 2012-06-05T12:28:31.277 回答