36

fait des trucs cool pour faire Javascript discret, donc ils ont fait des choses comme ceci:Comment Rails 3 "data-method = 'delete'" Se dégrade-t-il gracieusement? Rails 3

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

..converts à

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

Mais il vient de se produire à moi .. Quand je éteindre javascript la méthode n'est plus DELETE, c'est GET comme prévu. Y a-t-il des plans pour, ou y a-t-il moyen de permettre à ces attributs data- de se dégrader correctement, de sorte que ce lien soit toujours une demande DELETE?

Répondre

37

La modification apportée dans Rails 3 avec ces attributs data- ne concernait pas la dégradation progressive, mais plutôt le JavaScript discret.

Dans Rails 2, en spécifiant :method => :delete sur un lien générerait un tas de JavaScript en ligne qui créerait un formulaire avec une entrée masquée, puis soumettre le formulaire. C'était la même chose que maintenant: désactiver JavaScript et par défaut une requête GET. En tant que tel, soutenir le cas de non JavaScript est le même que c'était avant. Une option consiste à utiliser un formulaire/bouton au lieu d'un lien afin que vous puissiez inclure la méthode en tant que champ masqué, un peu comme le fait le JavaScript Rails 2. Une autre option consiste à faire en sorte que la version GET vous amène à une page intermédiaire qui à son tour a le formulaire/bouton.

L'avantage de la nouvelle approche est qu'elle est discrète. Le JavaScript pour modifier le verbe HTTP existe dans un fichier externe et utilise les attributs data- pour déterminer à quels éléments il doit être attaché.

4

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.

+0

il peut avoir la chaîne de requête _method = supprimer – myfreeweb

+0

peut fonctionne, oui vous droit – shingara

21

Plutôt que d'utiliser la méthode link_to - qui vous avez besoin de JavaScript utilisé pour faire en sorte que la méthode HTTP est DELETE - utiliser la méthode button_to, qui va créer une forme avec un élément d'entrée caché qui indique Rails pour traiter le HTTP méthode 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.

+0

Cela a fonctionné pour moi quand le lien lui-même a été chargé après le fait via JavaScript, empêchant Rails de le remplacer par le formulaire. Je suppose que 'button_to' a fonctionné parce qu'il le transforme en un formulaire sur le côté Ruby des choses au lieu de JavaScript après le chargement de la page. Je n'avais jamais entendu parler de 'button_to' avant, alors merci! – LouieGeetoo

1

Ce n'est pas possible sans javascript.

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

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