ruby-on-rails - remote - rubyonrails
¿Cómo se degrada graciosamente Rails 3 "data-method=''delete''"? (4)
Rails 3 hace algunas cosas interesantes para hacer Javascript discreto, por lo que han hecho cosas como esta:
= link_to "Logout", user_session_path, :method => :delete
..convierte a
<a href="/logout" data-method="delete" rel="nofollow">Logout</a>
Pero se me acaba de ocurrir ... Cuando desactivo javascript, el método ya no es ELIMINAR, se GET como se esperaba. Entonces, ¿hay planes para, o existe alguna forma de, permitir que estos atributos de data-
degraden con elegancia, por lo que ese enlace todavía es una solicitud DELETE?
El cambio que hicieron en Rails 3 con estos atributos de data-
no se trató de una degradación elegante, sino de un JavaScript discreto.
En Rails 2, especificar :method => :delete
en un enlace generaría un montón de JavaScript en línea que crearía un formulario con una entrada oculta y luego enviaría el formulario. Eso era lo mismo que ahora: desactiva JavaScript y se convierte en una solicitud GET por defecto. Como tal, admitir el caso de no tener JavaScript es el mismo que antes.
Una opción es usar un formulario / botón en lugar de un enlace para que pueda incluir el método como un campo oculto, muy parecido al JavaScript de Rails 2. Otra opción es hacer que la versión GET lo lleve a una página intermedia que a su vez tiene la forma / botón.
El beneficio del nuevo enfoque es que no es molesto. El JavaScript para cambiar el verbo HTTP existe en un archivo externo y usa los atributos de data-
para determinar a qué elementos se debe adjuntar.
En lugar de utilizar el método link_to
, que requeriría que use JavaScript para asegurarse de que el método HTTP es DELETE
, use el método button_to
, que creará un formulario con un elemento de entrada oculto que le indica a Rails que trate el método HTTP como DELETE
que POST
Si es necesario, puede usar CSS para darle un estilo al botón en el formulario para que parezca un enlace.
La única oportunidad que tiene es definir un formulario. Un enlace no puede ser un POST con _method = "delete" sin Javascript o por formulario.
No es posible sin javascript.
Hago un pequeño plugin jQuery para convertir el atributo de enlace de data-method
a formularios pseudo ocultos (por ejemplo, en el proyecto laravel).
Si desea usarlo: https://github.com/Ifnot/RestfulizerJs