¿Cómo se degrada con gracia el "método de datos de datos de Rails 3 = 'eliminar'"?
Pregunta
Rails 3 hace algunas cosas interesantes para que JavaScript sea discreto, por lo que han hecho cosas como esta:
= link_to "Logout", user_session_path, :method => :delete
..convertidos a
<a href="/logout" data-method="delete" rel="nofollow">Logout</a>
Pero se me ocurrió ... Cuando apago JavaScript, el método ya no es eliminado, es como se esperaba. También hay planes para, o hay alguna forma de permitir estos data-
¿Atributos para degradarse con gracia, por lo que ese enlace sigue siendo una solicitud de eliminación?
Solución
El cambio que hicieron en Rails 3 con estos data-
Los atributos no se trataban de una degradación elegante, se trataba de JavaScript discreto.
En Rails 2, especificando :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 fue lo mismo que es ahora: apagar JavaScript y el valor predeterminado es una solicitud GET. Como tal, apoyar el caso de No 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, al igual que lo hace JavaScript Rails 2. Otra opción es que la versión Get lo lleve a una página intermedia que a su vez tiene el formulario/botón.
El beneficio del nuevo enfoque es que es discreto. El JavaScript para cambiar el verbo http existe en un archivo externo y utiliza el data-
atributos para determinar a qué elementos debe estar unido.
Otros consejos
En lugar de usar el link_to
Método: que requeriría que use JavaScript para garantizar que el método HTTP sea DELETE
-- utilizar el button_to
método, que creará un formulario con un elemento de entrada oculto que le indique a los rieles que traten el método HTTP como DELETE
más bien que POST
. Si es necesario, puede usar CSS para peinar el botón en el formulario para que parezca un enlace.
La única oportunidad que tienes es definir un formulario. Un enlace no puede ser una publicación con _method = "Eliminar" sin JavaScript o por forma.
No es posible sin JavaScript.
Hago un pequeño complemento jQuery para convertir data-method
Atributo de enlace a formularios ocultos de pseudo (utilizado en el proyecto Laravel, por ejemplo).
Si quieres usarlo: https://github.com/ifnot/restfulizerjs