36

Rails 3 hace algunas cosas interesantes para hacer Javascript discreta, por lo que he hecho cosas como esta:¿Cómo se degrada graciosamente Rails 3 "data-method = 'delete'"?

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

..converts a

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

Pero me acaba de ocurrir .. Cuando desactive javascript el método ya no es ELIMINAR, se GET como se esperaba. Entonces, ¿hay planes para, o hay alguna forma de, permitir que estos atributos data- se degraden con elegancia, por lo que ese enlace todavía es una solicitud DELETE?

Respuesta

37

El cambio que hicieron en Rails 3 con estos atributos 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 utilizar un formulario/botón en lugar de un enlace para que pueda incluir el método como un campo oculto, al igual que el 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 utiliza los atributos data- para determinar a qué elementos se debe adjuntar.

4

La única posibilidad que tiene es definir un formulario. Un enlace no puede ser un POST con _method = "delete" sin Javascript o por formulario.

+0

que puede tener cadena de consulta _method = borrar – myfreeweb

+0

puede trabajar, sí derecho – shingara

21

En lugar de utilizar el método link_to - lo que requeriría utiliza JavaScript para asegurar que el método HTTP es DELETE - utilizar el método button_to, lo que creará un formulario con un elemento de entrada oculto que dice rieles para tratar el HTTP método como DELETE en lugar de POST. Si es necesario, puede usar CSS para darle un estilo al botón en el formulario para que parezca un enlace.

+0

Esto funcionó para mí cuando el propio enlace se cargó después de los hechos a través de JavaScript, rieles que impiden de reemplazarlo con la forma. Supongo que 'button_to' funcionó porque lo convierte en una forma del lado Ruby de las cosas en lugar de hacerlo con JavaScript después de que se carga la página. Nunca había escuchado sobre 'button_to' antes, ¡así que gracias! – LouieGeetoo

1

No es posible sin javascript.

Realizo un pequeño plugin de jQuery para convertir el atributo de enlace data-method en formularios pseudo ocultos (por ejemplo, en el proyecto laravel).

Si desea utilizarlo:? https://github.com/Ifnot/RestfulizerJs