2010-11-28 9 views
1

Je fais une application ROR (rails 2.3.5) très simple et j'utilise les jRails plugin jQuery. L'idée est de déjeuner modifié dans le lecteur jQuery youtube, qui jouera des vidéos aléatoires de la liste du contrôleur de ror.Comment transmettre une variable Rails à la fonction jQuery?

controller.rb

def show 
    @clip = Video.find(:all, :select =>'link', :order => 'RANDOM()', :limit => 1).map(&:link) 
    respond_to do |format| 
     format.html 
    end 
    end 

show.html.erb

<div id="random"> 
<%[email protected]%> 
</div> 

Le lien est ici juste un lien youtube aléatoire par exemple. La question pour moi boiteux est comment obtenir cette variable dans cette fonction jQuery?

application.js

Serait très reconnaissant pour toute aide.

+0

A quoi ressemble votre sortie rendue? –

Répondre

4

Laissez votre code de rails comme il est et utilisé jQuery:

$(document).ready(function(){ 
    $('#player').youTubeEmbed($('#random').text()) 
}); 

Pour une meilleure accessibilité je changerais le erb à:

<div id="random"> 
<%=link_to h(@clip), h(@clip) %> 
</div> 

puis les js:

$(document).ready(function(){ 
    $('#player').youTubeEmbed($('#random a').attr('href')); 
    $('#random').hide(); 
}); 
+0

Jakub, merci! Votre solution a aidé, maintenant cela fonctionne. Maintenant, je peux continuer quetly mon auto-éducation. – Maay

2

En supposant que la variable contient l'URL, comme ceci:

$(document).ready(function(){ 
    $('#player').youTubeEmbed("<%=escape_javascript(@clip)%>"); 
}); 

(Désolé, a raté le fait que le JavaScript n'a pas été dans le même fichier que le HTML - et il shouldn » t être!)

Assuuming la variable contient l'URL, si vous ne voulez pas l'URL, vous pouvez l'intégrer dans une variable de page comme si (remplacer le code div dans show.html.erb avec les éléments suivants):

<script type='text/javascript'> 
window.myStuff = { 
    clipUrl: "<%=escape_javascript(@clip)%>" 
}; 
</script> 

... (ou

<script type='text/javascript'> 
var myStuff = { 
    clipUrl: "<%=escape_javascript(@clip)%>" 
}; 
</script> 

... qui est à peu près la même chose).

... et vous pouvez l'utiliser comme ceci:

$(document).ready(function(){ 
    $('#player').youTubeEmbed(window.myStuff.clipUrl); 
}); 

Lors de la sortie de la valeur d'une variable de cette façon, vous devez vous assurer que ce qui est écrit en JavaScript finit par être valide. Ainsi, par exemple, si la variable @clip contient un " ou un \, vous devez vous assurer que le " est transformé en \" et que toute barre oblique inversée est transformée en \\. Jakub Hampl a utilement souligné la fonction escape_javascript pour cela, que j'ai édité dans les exemples de code.

En faisant cela, cela signifie que nous mettons un nouveau symbole sur window. J'ai fait de notre nouveau symbole un objet de sorte que si nous devons faire cela avec d'autres choses, nous pouvons les inclure dans le même objet afin de ne pas avoir de symboles partout (créant beaucoup de symboles globaux   — qui est pour ainsi, window propriétés   — tend à devenir un problème de maintenance, mieux évité).Ainsi, par exemple, si vous aviez deux clips:

<script type='text/javascript'> 
window.myStuff = { 
    someNiftyClip:  "<%=escape_javascript(@clip)%>", 
    someOtherNiftyClip: "<%=escape_javascript(@anotherClip)%>" 
}; 
</script> 

hors sujet: Dans la ligne d'appel youTubeEmbed, je constate ajouté un point-virgule à la fin. Mieux vaut ne pas compter sur JavaScript semicolon insertion.

+1

Utilisez 'escape_javascript' pour cette approche. '@ clip' pourrait être quelque chose comme' http://youtu.be/";alert('evil code here '); "'. –

+0

@Jakub: Merci. J'ai mentionné l'importance de s'échapper, mais je ne suis pas très Railshead et je ne connaissais pas la fonction réelle. Maintenant je fais, édité dedans et lié à lui pour l'OP. Merci encore! –

+0

Votre option a également fonctionné, merci beaucoup. C'est génial de trouver une telle communauté, merci les gars! – Maay

0

Vous pouvez mettre la variable dans un champ caché, vous pouvez ensuite utiliser dans la fonction comme $ (« # hiddenFieldID ») val().

Questions connexes