【问题标题】:Why does HTTP delete need javascript to work?为什么 HTTP 删除需要 javascript 才能工作?
【发布时间】:2012-06-05 11:48:18
【问题描述】:

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

<%= javascript_include_tag :defaults %>

一切正常。

为什么会这样?

【问题讨论】:

    标签: javascript ruby-on-rails authentication devise http-delete


    【解决方案1】:

    链接(通常)总是得到请求。为了让链接发送非获取请求,您需要一些 javascript 来修改链接的行为。

    此外,浏览器通常只支持 GET/POST 请求,因此 rails 通过在帖子中添加 _method 字段来伪造其他方法(DELETE、PUT、...)。

    【讨论】:

    • 所以基本上 Rails 中的每个请求都是 GET 或 POST,而不仅仅是在 Rails 中。谢谢,很有帮助。
    • API 请求可以是“真正的”删除、放置等请求。只是浏览器只能获取/发布
    【解决方案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 动词的参数。

    【讨论】:

    • 这个函数会在每个 REST 表单中被调用吗?我解释得更好:如果不使用“form_for @resource”,而只使用“form tag ...”和 REST 资源怎么办?行为是否相同?
    • 用于处理链接。此代码即时创建隐藏表单并提交。如果您有一些 form_xxx(或 button_to),那么即使没有启用 javascript,您也可以使用它们来触发非 GET 操作。这就是为什么如果你害怕遇到一些没有 JavaScript 的用户,一些来源不建议使用非 GET 操作的链接。移动用户可能就是这种情况。
    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2012-07-13
    • 2017-08-14
    相关资源
    最近更新 更多