2010-11-12 28 views
35

Je veux avoir certains de mes partiels comme extraits de démarques. Quelle est la manière la plus simple de les rendre en utilisant les rails standard erb templating?Comment est-ce que je peux rendre automatiquement des partiels en utilisant markdown dans Rails 3?

Idéalement, je voudrais faire quelque chose comme ceci:

Si j'ai partiel dans app/views/_my_partial.md.erb:

My awesome view 
=============== 

Look, I can **use** <%= language %>! 

que je référence d'un Vue comme ceci:

<%= render "my_partial", :language => "Markdown!" %> 

Je veux obtenir une sortie qui ressemble à ceci:

<h1>My awesome view</h1> 
<p>Look, I can <strong>use</strong> Markdown!</p> 
+0

https://stackoverflow.com/a/10131299/1536309 –

Répondre

75

fin de compte, la voie droite (tm) à Pour ce faire, utilisez ActionView::Template.register_template_handler:

lib/markdown_handler.rb:

require 'rdiscount' 

module MarkdownHandler 
    def self.erb 
    @erb ||= ActionView::Template.registered_template_handler(:erb) 
    end 

    def self.call(template) 
    compiled_source = erb.call(template) 
    "RDiscount.new(begin;#{compiled_source};end).to_html" 
    end 
end 

ActionView::Template.register_template_handler :md, MarkdownHandler 

Si vous require 'markdown_handler' dans votre config/application.rb (ou un initialiseur), alors peut être rendu une vue ou partielle Markdown avec interpolation ERb en ​​utilisant l'extension .html.md:

app/views/home/index.html.md:

My awesome view 
=============== 

Look, I can **use** <%= @language %>! 

app/controllers/home_controller.rb:

class HomeController < ApplicationController 
    def index 
    @language = "Markdown" 
    end 
end 
+12

Nice. Permettez-moi d'ajouter, n'oubliez pas d'ajouter '' 'gem 'rdiscount'''' à votre gemfile et que vous pouvez mettre le gestionnaire dans le répertoire init à la place et il sera simplement toujours chargé. '' 'config/initializers/markdown_handler.rb''' Cela signifie que vous pouvez passer la modification à' '' 'config/applicaiton.rb''' – genkilabs

+0

La bonne chose à propos de cette solution est qu'elle fonctionne avec les partiels (même si la mise en page est haml) en faisant '= raw (render ('editable/intro'))' se référant à '/ views/editable/_intro.html.md'. Seul le «cru» se sent hackish, et peut-être cela soulève des problèmes de sécurité, mais d'ailleurs c'est tout bon! –

+2

Intéressant, je soupçonne que cela pourrait être atténué avec l'ajout d'un .html_safe à la source générée. Le code retourné par 'erb.call (template)' est déjà échappé par l'ERb rendu, et nous ne faisons aucune interpolation ici, donc ça devrait aller. – Jacob

19

Il ne s'agit pas d'une solution de démarquage pure, mais vous pouvez utiliser HAML filters pour afficher la démarcation, ainsi que d'autres langages de balisage.

Par exemple, dans app/views/_my_partial.html.haml:

:markdown 
    My awesome view 
    =============== 

    Look, I can **use** #{language}! 
+5

Ce que je n'aime pas cette approche est-il force une empreinte de ce qui devrait sans doute être un fichier de démarquage pur. Si je veux qu'une personne copie puisse contrôler un certain contenu, je veux qu'ils possèdent le fichier entier et ne pas avoir à se souvenir de garder tout en retrait. –

+0

Mais alors la bonne chose est qu'il ne charge pas les mêmes fonctionnalités deux fois, non? Est-ce que 'gem 'rdiscount'' est toujours nécessaire? Peut-être que cette réponse est un bon compromis? http://stackoverflow.com/a/8026947/1620081 –

4

ont trouvé moyen de ne pas utiliser haml dans une telle situation.

dans vues/layouts/_markdown.html.erb

<%= m yield %> 

dans app/helpers/application_helper.rb

def m(string) 
    RDiscount.new(string).to_html.html_safe 
end 

dans Gemfile

gem 'rdiscount' 

Ainsi, vue, vous pouvez l'appeler comme:

<%= render :partial => "contract.markdown", :layout => 'layouts/markdown.html.erb' %> 

Et contract.markdown sera formaté comme démarquage

6

Je viens de publier un petit bijou markdown-rails, qui gère .html.md vues.

Vous ne pouvez pas enchaîner avec Erb si - c'est seulement pour les vues statiques et les partiels. Pour intégrer le code Ruby, vous devez utiliser la solution de tjwallace avec :markdown.

4

En empilant sur les solutions déjà présentées, c'est un moyen d'interpolation dans Rails 3 pour rendre un fichier Markdown pur dans une vue d'un partiel sans indentation inutile utilisant le filtre :markdown de Haml et la gemme RDiscount. Le seul hic est que votre fichier Markdown est un fichier Haml, mais cela ne devrait pas importer pour quelqu'un comme une personne de copie.

En Gemfile:

gem 'rdiscount' 

Dans app/views/my_page.html.HAML

:markdown 
    #{render 'my_partial', language: 'Markdown!'} 

Dans app/views/_my_partial.html.haml

My awesome view 
=============== 

Look, I can **use** #{language}! 

Si vous ne l'avez pas besoin de la variable :language passé dans le fichier Markdown, vous pouvez supprimeraient complètement votre Markdown étant un fichier Haml:

Dans app/views/my_page.html.haml

:markdown 
    #{render 'my_partial.md'} 

Dans app/views/_my_partial.md

My awesome view 
=============== 

Sorry, cannot **use** #{language} here! 

Ne pas comme ces satanés underscores sur vos fichiers Markdown?

Dans app/views/my_page.html.haml

:markdown 
    #{render file: 'my_markdown.md'} 

Dans app/views/my_markdown.md

My awesome view 
=============== 

Sorry, cannot **use** #{language} here! 
+1

Haha, méchant. J'aime celui la. – danneu

2

Leveraged your answer pour faire un petit bijou à rendre pour GitHub aromatisée Markdown dans Rails (via HTML :: Pipeline): https://github.com/afeld/html_pipeline_rails

+0

Merci, cette gemme était la solution parfaite pour moi (en fait Rails 4). –

+0

Cette gemme était parfaite pour Rails 4. J'ai permis de mettre tout le contenu de Markdown dans un seul dossier et de l'inclure si nécessaire via les partiels.Pas besoin d'avoir la vue entière Markdown, juste les parties de contenu. –

0

Voici une version similaire à @ Jacob mais en utilisant Redcarpet.

module MarkdownHandler 
    def self.erb 
    @erb ||= ActionView::Template.registered_template_handler(:erb) 
    end 

    def self.call(template) 
    options = { 
     fenced_code_blocks:   true, 
     smartypants:     true, 
     disable_indented_code_blocks: true, 
     prettify:      true, 
     tables:      true, 
     with_toc_data:    true, 
     no_intra_emphasis:   true 
    } 
    @markdown ||= Redcarpet::Markdown.new(RedcarpetHeaderFix, options) 
    "#{@markdown.render(template.source).inspect}.html_safe" 
    end 
end 
ActionView::Template.register_template_handler :md, MarkdownHandler 

Crédit complet à lencioni qui a publié ce billet in this gist.

Et si vous souhaitez évaluer erb:

erb = ERB.new(template.source).result 
@markdown ||= Redcarpet::Markdown.new(RedcarpetHeaderFix, options) 
"#{@markdown.render(erb).inspect}.html_safe" 
0

Vous pouvez utiliser Markdown intégré dans Rails 5.Intégré démarquage est basé sur la solution fournie par Jacob above

  1. Ajoutez ces deux lignes à votre application de Gemfile:

    bijou 'redcarpet' bijou 'EMD'

  2. paquet d'installation. Puis créez une vue app/view/home/changelog.html.md et collez votre démarque dans le fichier .md.

  3. Générer un contrôleur de la maison en utilisant la commande suivante

    rails generate controller home

  4. A votre route.rb, ajoutez cette ligne:

    get '/changelog', :to 'home#changelog'

  5. C'est tout. Visitez http://localhost:3000/changelog pour voir votre rendu démarquage

Source: http://github.com/ytbryan/emd