【问题标题】:How Does Rails 3's "data-method='delete'" Degrade Gracefully?Rails 3 的“data-method='delete'”如何优雅地降级?
【发布时间】:2011-02-18 01:08:48
【问题描述】:

Rails 3 做了一些很酷的事情来使 Javascript 不引人注目,所以他们做了这样的事情:

= link_to "Logout", user_session_path, :method => :delete

..转换为

<a href="/logout" data-method="delete" rel="nofollow">Logout</a>

但是我突然想到了.. 当我关闭 javascript 时,该方法不再是 DELETE,而是 GET 预期。那么是否有计划或有什么方法可以让这些data- 属性优雅地降级,以便该链接仍然是一个DELETE 请求?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 unobtrusive-javascript graceful-degradation


    【解决方案1】:

    你唯一的机会就是定义一个表单。链接不能是 _method="delete" 没有 Javascript 或表单的 POST。

    【讨论】:

    • 它可以有查询字符串?_method=delete
    【解决方案2】:

    他们在 Rails 3 中使用这些 data- 属性所做的更改不是关于优雅降级,而是关于不显眼的 JavaScript。

    在 Rails 2 中,在链接上指定 :method =&gt; :delete 会生成一大堆内联 JavaScript,这些 JavaScript 会创建一个带有隐藏输入的表单,然后提交该表单。这和现在一样:关闭 JavaScript,它默认为 GET 请求。因此,支持无 JavaScript 的情况和以前一样。

    一种选择是使用表单/按钮而不是链接,这样您就可以将方法作为隐藏字段包含在内,就像 Rails 2 JavaScript 所做的那样。另一种选择是让 GET 版本将您带到一个中间页面,该页面又具有表单/按钮。

    新方法的好处是不显眼。用于更改 HTTP 谓词的 JavaScript 存在于外部文件中,并使用 data- 属性来确定应附加到哪些元素。

    【讨论】:

      【解决方案3】:

      而不是使用link_to 方法——这需要你使用JavaScript 来确保HTTP 方法是DELETE——使用button_to 方法,它会创建一个带有隐藏输入元素的表单,它告诉Rails 将 HTTP 方法视为DELETE 而不是POST。如有必要,您可以使用 CSS 为表单中的按钮设置样式,使其看起来像一个链接。

      【讨论】:

      • 当链接本身通过 JavaScript 加载后,这对我有用,防止 Rails 用表单替换它。我认为button_to 起作用了,因为它在页面加载后将其转换为 Ruby 方面的表单,而不是使用 JavaScript。我以前从未听说过button_to,所以谢谢!
      【解决方案4】:

      没有javascript是不可能的。

      我制作了一个小型 jQuery 插件,用于将 data-method 链接属性转换为伪隐藏表单(例如在 laravel 项目中使用)。

      如果你想使用它:https://github.com/Ifnot/RestfulizerJs

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 2012-07-01
        • 2011-08-29
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 2012-05-15
        • 2011-11-21
        • 2010-10-07
        相关资源
        最近更新 更多