2009-12-24 33 views
58

Uno de mis objetos modelo tiene una columna de 'texto' que contiene el código HTML completo de una página web.¿Cómo devolver HTML directamente desde un controlador Rails?

Me gustaría escribir una acción de controlador que simplemente devuelva este HTML directamente desde el controlador en lugar de pasarlo a través de las plantillas .erb como el resto de las acciones en el controlador.

Mi primer pensamiento fue incorporar esta acción en un nuevo controlador y crear una plantilla .erb personalizada con un diseño vacío, y solo <%= modelObject.htmlContent %> en la plantilla, pero me pregunté si habría una forma mejor de hacerlo en Rails.

Respuesta

83

En su bloque controlador respond_to, puede utilizar:

render :text => @model_object.html_content 

o:

render :inline => "<%= @model_object.html_content %>" 

Por lo tanto, algo así como:

def show 
    @model_object = ModelObject.find(params[:id]) 

    respond_to do |format| 
    format.html { render :text => @model_object.html_content } 
    end 
end 
+4

(Escaso) Documentación a http://api.rubyonrails.org/classes/ActionView/Rendering .html en caso de que alguien más lo esté buscando! :) –

+5

¿Es realmente necesario usar el bloque 'responder_to'? 'render: text => '

text

' 'funciona muy bien para mí en Rails 4. Pensé que' responder_to' era solo para tratar con múltiples tipos de aceptación. –

+1

Rails 5 produce una advertencia de desaprobación al usar 'render text: ...'. Si desea renderizar HTML, use 'render html: ...', para texto use 'render plain: ...'. –

3

Sus trabajos para mí

def show 
    @model_object = ModelObject.find(params[:id]) 

    respond_to do |format| 
    format.html { render :inline => "<%== @model_object['html'] %>" } 
    end 
end 
38

En últimas carriles (4.1.x), por lo menos, esto es mucho más simple que la respuesta aceptada:

def show 
    render html: '<div>html goes here</div>'.html_safe 
end 
+1

muchas gracias, también funciona en rieles 5 api-only :) –

Cuestiones relacionadas