2015-11-17 2 views
0

J'utilise PrivatePub et je rencontre un comportement étrange ici. Avant de passer par les détails s'il vous plaît noter que j'utilise Ruby 1.9.3 et Rails 3.2.2.Comment puis-je mélanger le code ruby ​​en ligne avec mon RJS côté client?

Disons que j'ai TestsController:

class TestsController < ApplicationController 
    def index 
    end 

    def create 
    respond_to do |format| 
     format.js 
    end 
    end 
end 

Et tests/index.html.erb:

<h1>Test</h1> 

<%= content_for :footer do %> 
    <%= subscribe_to tests_path %> 
<% end %> 

Et tests/create.js.erb:

<% publish_to tests_path do %> 
    alert("Working fine"); 

    if (false) {alert("This never run");}; 

    if (false) {<% puts "*"*100 %>}; 

<% end %> 

simple et simple. Maintenant, mon problème est que chaque fois que je cours create action, pour une raison quelconque <% puts "*"*100 %> toujours exécuter (même lorsque j'ai fait if (faux) déclaration).

Je sais que je peux utiliser Ruby if et devrait fonctionner correctement, quelque chose comme:

<% if false %> 
    <% puts "*"*100 %> 
    <% end %> 

Mais je veux faire quelques clients validation côté (comme par exemple pour vérifier qu'un div existe et rendre quelques partials en conséquence) comme:

if ($("#chat").length){ 
    $("#chat").append("<%= j render(@messages) %>"); 
} 

Mais semble <%= j render(@messages) %> sera rendu tout le temps.

Comment puis-je m'attaquer à ce problème et utiliser l'instruction if et le code du template ruby ​​côté client à l'intérieur? En ce moment, il semble que tout ce qui est à l'intérieur <%%> soit déclenché et je ne veux pas de ce comportement.

Répondre

1

puts "*"*100 est toujours imprimé car pendant le traitement de votre fichier js.erb, tout le code Ruby à l'intérieur du fichier est exécuté.

Le code JavaScript n'est exécuté que lorsqu'il s'exécute dans votre navigateur. L'instruction if (false) n'a donc aucun effet pendant le traitement ERB du fichier. Donc, cela n'a rien à voir avec la gemme PrivatePub, mais c'est parce que vous mélangez du code JS et du code Ruby.

Pour votre dernier exemple de code (chat), essayez render_to_string, mais ce n'est peut-être pas suffisant car la variable @messages est vide lors de la compilation du fichier JS.

Je voudrais ajouter que mélanger JS et Ruby peut causer des maux de tête. Il est parfois préférable de définir des attributs de données sur vos éléments HTML avec Ruby/ERB dans votre fichier de vue, puis de laisser le code JS lire et utiliser la valeur de ces attributs de données. De cette façon, vous n'avez pas besoin d'utiliser le code Ruby dans votre code JS.

+0

Merci pour l'aide. Vous avez raison, j'ai juste compris cela en appliquant plus de test. C'était une mauvaise idée de mélanger JS avec mon code ruby ​​:(surtout ça devient de plus en plus compliqué –

+0

Serait-ce une bonne idée d'émettre une requête http du côté client? Comme 'if (false) {$ .get (" tests/puts_action ", function (data) {});}; 'et puts_action comprendrait" puts "*" * 100'? –