36 votes

Comment "data-method =" delete "" de Rails 3 se dégrade-t-il correctement?

Rails 3 fait des trucs sympas pour rendre Javascript discret, ils ont donc fait des choses comme celle-ci:

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

..convertit à

 <a href="http://stackoverflow.com/logout" data-method="delete" rel="nofollow">Logout</a>
 

Mais cela m’est venu à l’esprit. Quand j’éteins javascript, la méthode n’est plus DELETE, c’est GET comme prévu. Alors est-il prévu, ou existe-t-il un moyen de permettre à ces attributs data- de se dégrader avec élégance, de sorte que ce lien constitue toujours une demande DELETE?

37voto

Jimmy Cuadra Points 13499

Le changement qu'ils ont fait dans Rails 3 avec ces data- attributs n'était pas à propos de la dégradation gracieuse, c'était à propos de JavaScript discret.

Dans Rails 2, en précisant :method => :delete sur un lien serait de générer tout un tas de JavaScript en ligne qui permettrait de créer un formulaire avec un caché d'entrée et validez le formulaire. C'était le même qu'aujourd'hui: désactiver JavaScript et la valeur par défaut d'une requête GET. En tant que tel, en soutenant le cas de pas de JavaScript est le même qu'avant.

Une option est d'utiliser un formulaire/bouton au lieu d'un lien de sorte que vous pouvez inclure la méthode comme un champ caché, un peu comme les Rails 2 le JavaScript n'. Une autre option est d'avoir le OBTENIR la version de vous prendre pour une page intermédiaire qui est de la forme/bouton.

L'avantage de la nouvelle approche est qu'il est discret. Le JavaScript pour changer la HTTP verbe existe dans un fichier externe et utilise l' data- attributs pour déterminer les éléments qu'il doit être attaché.

21voto

Tekhne Points 141

Plutôt que d’utiliser la méthode link_to - ce qui vous obligerait à utiliser JavaScript pour vous assurer que la méthode HTTP est DELETE - utilisez la méthode button_to , qui créera un formulaire avec un élément d'entrée masqué qui indique à Rails de traiter la méthode HTTP comme DELETE plutôt que POST . Si nécessaire, vous pouvez ensuite utiliser CSS pour styler le bouton dans le formulaire afin qu'il ressemble à un lien.

4voto

shingara Points 26980

La seule chance que vous avez est de définir un formulaire. Un lien ne peut pas être un POST avec _method = "delete" sans Javascript ou par formulaire.

1voto

Ifnot Points 716

Ce n'est pas possible sans JavaScript.

Je crée un petit plugin jQuery pour convertir l'attribut de lien data-method en formes pseudo-cachées (utilisées dans le projet laravel par exemple).

Si vous voulez l'utiliser: https://github.com/Ifnot/RestfulizerJs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X