2017-08-15 2 views
0

Sur mon site Web Middleman-construit, j'ai besoin d'exécuter le code Ruby spécifique sur le contenu de toutes les pages (modèles).Exécuter la méthode Ruby sur toute la page dans Middleman

Par exemple, si j'avais suivant aide dans mon config.rb:

def myexample(text) 
    text.gsub("dog","cat") 
end 

Et dans mon test.html.haml:

Mon visualisées et les généré /test.html lirait:

Some text about a cat. 

Cependant, j'utilise plusieurs façons différentes s pour sortir le texte qui doit être modifié, notamment via le filtre :markdown de HAML, donc je préférerais ne pas tout emballer dans l'assistant = myexample("Text"). Je voudrais être en mesure d'exécuter le code Ruby qui prendrait le contenu de toutes les pages (de préférence) ou généré une sortie HTML (si la première option n'est pas possible) comme un argument passé à un tel assistant.

Idéalement, ce code serait exécuté dans les environnements de développement et de construction, mais si cela n'est pas possible, la construction est suffisante.

Est-il possible de le faire?

PS. Dans mon cas spécifique, j'utilise une notation abrégée pour référencer d'autres pages, puis j'utilise un regular expression and eval() in order to replace them with relative links from data files.

+0

Y a-t-il une raison pour laquelle vous ne pouvez pas vous assurer que HAML génère le code HTML final que vous recherchez? Ce que vous faites est définitivement non conventionnel, et vous pouvez le rendre plus compliqué que ce qu'il doit être. Mais je sais aussi que votre code actuel est beaucoup plus complexe que cela. –

+0

Le problème principal ici est que j'ai plus de 100 utilisations du filtre HAML '': markdown'', qui est utilisé pour traiter la marque de bloc (plusieurs paragraphes), dont 20% incluent des références '' ref.pageA''. J'ai été capable de changer mes partiels, donc maintenant ils sont traités par votre code à partir de l'autre question, mais ces filtres HAML '': markdown'' ont encore des liens qui ont besoin d'être évalués. Je ne veux pas changer tous les filtres HAML en helper '' mymarkdown() '' car cela détruirait la lisibilité et helper ne semble pas pouvoir accepter les entrées de bloc (plusieurs paragraphes) de toute façon. – Rafal

+0

Si l'exécution du code sur la page entière n'est pas possible, alors ma seule solution serait de déplacer tous ces blocs sous le filtre HAML '': markdown'' dans le fichier de données et de les mettre dans le modèle avec '' mymarkdown''. Et puis je devrais emballer tous les autres bits de texte d'un paragraphe qui incluent également des liens avec l'aide '' mymarkdown''. – Rafal

Répondre

0

ActionController :: Base a la méthode render_to_string qui vous donnera le résultat HTML normal à partir du rendu d'une partie ou d'une page, mais au format chaîne. Cela vous permettra de récupérer le HTML rendu et de le modifier avant de le rendre réel comme un modèle en ligne.

Dans votre contrôleur:

rendered_html = render_to_string 'your_template_or_partial' 
# do stuff to rendered_html 
render inline: rendered_html.html_safe, layout: 'layouts/application' 

La méthode html_safe fait Rails sûrs sait qu'il est sûr de rendre ce que HTML. Vous ne voulez pas faire cela si l'entrée de l'utilisateur est en cours de rendu et que vous ne l'avez pas désinfecté !!!!

Si vous ne souhaitez pas utiliser de mise en page lors du rendu, supprimez simplement l'argument: layout.

+0

Je recommanderais d'utiliser cette approche plus tôt dans votre code. Vous pourriez être en mesure de simplifier votre système de rendu, ce qui ne semble pas si difficile à utiliser avec cette technique. Peut-être quelque chose comme: 'render_to_string' votre modèle HAML. Exécutez les [substitutions] (https://stackoverflow.com/a/45638542/1226389). Rendre la démarque avec Tilt. Ensuite, affichez votre modèle (maintenant en ligne). –