Как изящно ухудшается в data-method = 'delete' 'Rails 3? - PullRequest
36 голосов
/ 11 мая 2010

Rails 3 делает некоторые интересные вещи, чтобы сделать Javascript ненавязчивым, поэтому они сделали такие вещи:

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

.. преобразуется в

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

Но это только что пришло мне в голову .. Когда я отключаю javascript, метод больше не удаляется, а получается, как и ожидалось. Так есть ли планы или есть какой-то способ, чтобы эти атрибуты data- изящно ухудшались, так что ссылка все еще является запросом DELETE?

Ответы [ 4 ]

37 голосов
/ 11 мая 2010

Изменения, которые они внесли в Rails 3 с помощью этих атрибутов data-, были не о постепенном ухудшении, а о ненавязчивом JavaScript.

В Rails 2 указание :method => :delete для ссылки создаст целую кучу встроенного JavaScript, который создаст форму со скрытым вводом и затем отправит форму. Это было так же, как и сейчас: отключите JavaScript, и по умолчанию это GET-запрос. Таким образом, поддержка случая отсутствия JavaScript такая же, как и раньше.

Один из вариантов - использовать форму / кнопку вместо ссылки, чтобы вы могли включить метод в качестве скрытого поля, как это делает JavaScript в Rails 2. Другой вариант - заставить версию GET перейти на промежуточную страницу, которая в свою очередь имеет форму / кнопку.

Преимущество нового подхода в том, что он ненавязчив. JavaScript для изменения глагола HTTP существует во внешнем файле и использует атрибуты data-, чтобы определить, к каким элементам он должен быть присоединен.

21 голосов
/ 19 мая 2011

Вместо использования метода link_to - который потребует от вас использования JavaScript, чтобы гарантировать, что метод HTTP DELETE - используйте метод button_to, который создаст форму со скрытым элементом ввода, который сообщает Rails для обработки HTTP-метода как DELETE, а не POST. При необходимости вы можете использовать CSS для стилизации кнопки в форме, чтобы она выглядела как ссылка.

4 голосов
/ 11 мая 2010

Единственный шанс, который у вас есть, это определить форму. Ссылка не может быть POST с _method = "delete" без Javascript или по форме.

1 голос
/ 19 февраля 2014

Это невозможно без JavaScript.

Я создаю небольшой плагин jQuery для преобразования data-method атрибута ссылки в псевдо скрытые формы (например, используется в проекте laravel).

Если вы хотите его использовать: https://github.com/Ifnot/RestfulizerJs

...