75 votes

Méthode link_to et événement click dans Rails

Comment créer un lien de ce type :

<a href="#" onclick="document.getElementById('search').value=this.value">

en utilisant la méthode link_to dans Rails ?

Je n'ai pas pu le comprendre à partir Documentation sur Rails .

1 votes

À moins que vous n'ayez laissé le '#' pour des raisons de brièveté, l'utilisation de link_to ne semble pas avoir beaucoup d'intérêt. Pourquoi ne pas simplement utiliser une balise a avec le paramètre onclick comme vous l'avez fait ci-dessus.

194voto

Ron DeVera Points 9085

Vous pouvez utiliser link_to_function (supprimé dans Rails 4.1) :

link_to_function 'My link with obtrusive JavaScript', 'alert("Oh no!")'

Ou, si vous avez absolument besoin d'utiliser link_to :

link_to 'Another link with obtrusive JavaScript', '#',
        :onclick => 'alert("Please no!")'

Cependant, mettre JavaScript directement dans votre HTML généré est obtrusif et est mauvaise pratique .

Au lieu de cela, votre code Rails devrait simplement être quelque chose comme ceci :

link_to 'Link with unobtrusive JavaScript',
        '/actual/url/in/case/javascript/is/broken',
        :id => 'my-link'

Et en supposant que vous utilisez le Cadre JS Prototype JS comme ceci dans votre application.js :

$('my-link').observe('click', function (event) {
  alert('Hooray!');
  event.stop(); // Prevent link from following through to its given href
});

Ou si vous utilisez jQuery :

$('#my-link').click(function (event) {
  alert('Hooray!');
  event.preventDefault(); // Prevent link from following its href
});

En utilisant cette troisième technique, vous garantissez que le lien sera suivi d'une autre page - et non qu'il échouera en silence - si JavaScript n'est pas disponible pour l'utilisateur. N'oubliez pas que JavaScript peut être indisponible parce que l'utilisateur dispose d'une mauvaise connexion Internet (par exemple, appareil mobile, wifi public), parce que l'utilisateur ou son administrateur système l'a désactivé ou parce qu'une erreur JS inattendue s'est produite (par exemple, une erreur du développeur).

0 votes

La fonction link_to_function n'a pas été supprimée mais introduite dans Rails 3. Je suppose que tu voulais dire link_to_remote.

0 votes

link_to_function existe depuis Rails 1.0, mais vous avez raison de dire qu'il n'a pas été supprimé ; il a été déprécié (puis déprécié, et enfin, il a changé plusieurs fois de place). Je vais mettre à jour ma réponse. Merci !

0 votes

Si j'avais une liste d'actions, et que je voulais faire quelque chose de similaire. Comment faire entrer le symbole de l'action dans la fonction de clic ?

25voto

Jim Morris Points 1512

Pour faire suite à la réponse de Ron, si vous utilisez JQuery et que vous le placez dans application.js ou dans la section head, vous devez le placer dans une section ready()...

$(document).ready(function() {
  $('#my-link').click(function(event){
    alert('Hooray!');
    event.preventDefault(); // Prevent link from following its href
  });
});

3 votes

Notez que cela peut être raccourci en $(function() { ... }); ce qui est équivalent à $(document).ready(function() { ... });

0 votes

D'ailleurs jquery 3.0 recommande d utiliser $(function() { // Handler for .ready() called. }); au lieu de $(document).ready()

2 votes

Pour rails 5 avec turbolinks utiliser : $(document).on('turbolinks:load', function () {

10voto

Lei Wang Points 454

Utilisez simplement

=link_to "link", "javascript:function()"

1voto

Joaquin Diaz Points 47

Une autre solution consiste à capturer l'événement onClick et à agréger les données dans une fonction js.

.hmtl.erb

<%= link_to "Action", 'javascript:;', class: 'my-class', data: { 'array' => %w(foo bar) } %>

.js

// handle my-class click
$('a.my-class').on('click', function () {
  var link = $(this);
  var array = link.data('array');
});

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