2013-02-06 7 views
0

Note: Ceci est un cas d'utilisation très étrange et unique alors je m'excuse à l'avance si elle semble un peu ass-backward. J'ai un fichier haml content.haml et un fichier café-message main.coffee. Je souhaite obtenir le code HTML résultant du rendu de content.haml en une variable dans le fichier café/Javascript résultant.Mettre HTML en javascript en utilisant Ruby

Le résultat final doit être un fichier javascript rendu au navigateur.

Disons qu'ils ressemblent à ceci:

# content.haml 
.container 
    .some_content 
    blah blah blah 

-

# main.coffee 
html_content = ??? 
do_something_with_html_content(html_content) 

Je sais, cela semble ridicule, 'utiliser des modèles', 'récupérer le code HTML via ajax', etc. Dans ce cas, Cependant, ce n'est pas possible, tout doit être servi via un fichier JS et je ne peux pas récupérer d'autres ressources du serveur. Bizarre, je sais.

courte de reconstruction manuellement le haml dans le fichier coffeescript en se joignant à un tableau de chaînes comme ceci:

html_content = [ 
    '<div class"container">', 
    '<div class"some_content">', 
     'blah blah blah', 
    '</div>', 
    '</div>', 
] 

Je ne suis pas sûr que la meilleure façon de le faire.

Une autre façon je pensais de était de mettre quelque chose comme ça dans le fichier café:

html_content = '###CONTENT###' 

render ensuite le haml html en rubis, rendent les coffeescript à js puis remplacer ###CONTENT### avec le code html rendu avant servir au client. Cependant le html est une chaîne multi-ligne donc il détruit complètement le javascript.

Je suis convaincu qu'il doit y avoir une autre façon sympa de rendre le haml en html dans une variable telle qu'elle forme un javascript valide, mais mon cerveau est devenu vide.

+0

Pouvez-vous mettre votre code café dans HAML ou doit-il rester séparé dans un fichier différent? –

+0

Peu importe tant que le résultat est un fichier JS rendu au client. Je n'avais pas pensé à l'inverse, mais je ne sais pas comment ça marcherait? –

Répondre

0

Peut-être que vous pouvez essayer quelque chose comme ça dans un de vos vues:

:javascript 
    html_content = <%= escape_javascript(render partial: "content")%> 
    ## your own logic follows here.... 
0

Ne serait-il préférable d'utiliser un custom html data attribute puis récupérer le contenu de celui-ci dans js?

<div data-mycontent="YOUR CONTENT GOES HERE"></div> 

Et puis dans le café, utilisez les attributs dataset/données via jquery, si elle est disponible.

Si vous définissez un var via l'écriture directe du fichier, votre fichier js sera inaccessible, entre autres inconvénients.

+0

Le HTML/haml ne changera pas pour que le fichier JS résultant puisse être mis en cache (manuellement). Aussi, je n'ai pas accès au HTML de la page, juste le JS (comme je l'ai dit - cas d'utilisation bizarre ..) donc malheureusement je ne peux pas utiliser les éléments HTML –

0

Vous pouvez le faire en utilisant la gemme de pignons, comme le fait Rails. Vous avez juste besoin de renommer votre fichier CoffeeScript en main.coffee.erb et l'utiliser comme vous le feriez par exemple. un modèle de haml. Passez dans votre code html rendu avec une variable d'instance:

html_content = '<%= @html_content %>' 

Modifier: Ajout des citations manquantes.

+0

Mon problème avec ceci est que @html_content pourrait contenir un grand multi -line html chaîne qui ne serait pas javascript-safe. Y a-t-il un moyen facile d'éviter cela? –

+0

J'ai ajouté les guillemets simples manquants à l'exemple. Vous pouvez échapper toutes les guillemets simples du HTML: '@ html_content.gsub! (" '"," \' ")' De cette façon, plusieurs lignes de HTML ne seront pas un problème. Si le code html que vous transmettez est généré par l'utilisateur, vous pouvez également étendre le modèle de correspondance pour traiter les guillemets déjà échappés. – rausch

+0

Cela corrige des guillemets simples, mais pas de sauts de ligne, je suppose que je pourrais juste tout gsub mais il ne se sent pas très complet ... –

Questions connexes