Rails 3的“data-method ='delete'”如何优雅地降级?

时间:2010-05-11 08:46:55

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

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请求?

4 个答案:

答案 0 :(得分:37)

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

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

一个选项是使用表单/按钮而不是链接,因此您可以将该方法包含为隐藏字段,就像Rails 2 JavaScript一样。另一个选择是让GET版本带你到一个中间页面,而中间页面又有表格/按钮。

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

答案 1 :(得分:21)

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

答案 2 :(得分:4)

您唯一的机会是定义表单。没有Javascript或表单,链接不能是_method =“delete”的POST。

答案 3 :(得分:1)

没有javascript就不可能。

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

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