2010-11-12 26 views
35

Quiero tener algunos de mis parciales como fragmentos de marca. ¿Cuál es la forma más sencilla de renderizarlos utilizando los rieles estándar erb con plantillas?¿Cómo puedo renderizar parciales automáticamente utilizando rebajas en Rails 3?

Idealmente, me gustaría hacer algo como esto:

Si tengo un parcial en app/views/_my_partial.md.erb:

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

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

la que me refiero de una ver así:

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

quiero obtener una salida que tiene este aspecto:

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

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

Respuesta

75

Resulta que, de la manera correcta (tm) a hacer esto es usando 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 require 'markdown_handler' en su config/application.rb (o un inicializador), entonces cualquier punto de vista o parcial se pueden representar como de rebajas con ERb interpolación utilizando la extensión .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

Agradable. Permítanme agregar, no olviden agregar '' 'gem 'rdiscount'''' a su gemfile y que pueden poner el controlador en el directorio init en su lugar y simplemente se cargará siempre. '' 'config/initializers/markdown_handler.rb''' Esto significa que puede omitir el cambio a' '' config/applicaiton.rb''' – genkilabs

+0

Lo bueno de esta solución es que funciona con parciales (incluso si el diseño es haml) haciendo '= raw (render ('editable/intro'))' refiriéndose a '/ views/editable/_intro.html.md'. Solo el 'raw' se siente hackish, y tal vez plantea problemas de seguridad, ¡pero además todo está bien! –

+2

Interesante, sospecho que esto podría ser aliviado con la adición de .html_safe a la fuente generada. El código devuelto por 'erb.call (template)' ya ha sido escapado por el ERb prestado, y no estamos haciendo ninguna interpolación aquí, por lo que debería estar bien. – Jacob

19

No es una solución de reducción pura, pero puede usar HAML filters para renderizar, así como otros lenguajes de marcado.

Por ejemplo, en app/views/_my_partial.html.haml:

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

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

Lo que no me gusta de este enfoque es que obliga a una sangría de lo que debería ser discutible un archivo de descuento puro. Si quiero que una persona que copia pueda controlar algún contenido, quiero que posean el archivo completo y no tengan que recordar mantener todo sangrado en un nivel. –

+0

Pero lo bueno es que no carga las mismas funcionalidades dos veces, ¿verdad? ¿Sigue siendo necesario 'gema' rdiscount'' allí? Tal vez esta respuesta es un buen compromiso? http://stackoverflow.com/a/8026947/1620081 –

4

has encontrado manera de no utilizar haml en tal situación.

en views/layouts/_markdown.html.erb

<%= m yield %> 

en app/helpers/application_helper.rb

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

en Gemfile

gem 'rdiscount' 

Por lo tanto, a la vista se le puede llamar como:

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

Y contract.markdown se indicará como rebaja

6

Me acaba de lanzar una joya markdown-rails, que maneja .html.md vistas.

No se puede encadenar con Erb, es solo para vistas estáticas y parciales. Para incrustar el código de Ruby, debe usar la solución de tjwallace con :markdown.

4

Al acumular las soluciones ya presentadas, esta es una vía de interpolación en Rails 3 para renderizar un archivo Markdown puro en una vista parcial sin sangría innecesaria utilizando el filtro :markdown de Haml y la gema RDiscount. La única pega es que su archivo Markdown es un archivo Haml, pero eso no debería importarle a alguien como una copiadora.

En Gemfile:

gem 'rdiscount' 

En app/views/my_page.html.HAML

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

En app/views/_my_partial.html.haml

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

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

Si no necesita la variable :language aprobada en el fichero de reducción del precio, podría acabar por completo con su Markdown ser un archivo Haml:

En app/views/my_page.html.haml

:markdown 
    #{render 'my_partial.md'} 

En app/views/_my_partial.md

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

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

No como esos guiones molestos en sus archivos de rebajas?

En app/views/my_page.html.haml

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

En app/views/my_markdown.md

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

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

Haha, desagradable. Me gusta este. – danneu

2

apalancado your answer para hacer una joya para rinde por GitHub de sabores de rebajas en los carriles (a través de HTML :: Pipeline): https://github.com/afeld/html_pipeline_rails

+0

Gracias, esta joya fue la solución perfecta para mí (en realidad Rails 4). –

+0

Esta joya era perfecta para Rails 4. Me permitió poner todo el contenido de Markdown en una sola carpeta e incluirlo donde sea necesario a través de parciales.No es necesario tener el Markdown completo de la vista, solo las partes de contenido. –

0

Aquí es una versión similar a la de Jacob @ pero utilizando 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édito completo a lencioni que publicó este in this gist.

Y si desea evaluar erb:

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

Puede utilizar rebaja incrustado en 5 rieles.reducción del precio implícito se basa en la solución aportada por Jacob above

  1. Añadir estas dos líneas a Gemfile de su aplicación:

    joya 'redcarpet' joya 'EMD'

  2. paquete de instalación.

  3. A continuación, cree una vista app/view/home/changelog.html.md y pegue su marca en ese archivo .md.

  4. generar un controlador de casa usando el siguiente comando

    rails generate controller home

  5. A su route.rb, añada esta línea:

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

  6. eso es todo. Visita http://localhost:3000/changelog para ver su rebaja dictada

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

Cuestiones relacionadas