Estoy intentando generar una respuesta JSON que incluya algo de HTML. Por lo tanto, tengo /app/views/foo/bar.json.erb
:
{
someKey: 'some value',
someHTML: "<%= h render(:partial => '/foo/baz') -%>"
}
Quiero que se renderice /app/views/foo/_baz.html.erb
, pero solo se renderizará /app/views/foo/_baz.json.erb
. Pasar :format => 'html'
no ayuda.
ruby-on-rails
format
render
partial
actionview
James A. Rosen
fuente
fuente
Respuestas:
Comenzando con Rails 3.2.3, al llamar a render: parcial (solo funciona fuera del
respond_to
bloque).en vez de
fuente
:format
opción lo hiciera trabajo. ¡Gracias!:content_type
opción en algunos casos; por ejemplo,format.pdf
solo se puede hacer con renderizar una plantilla HTML desde el interior de un bloquerender "template", formats: [:html], content_type: "text/html"
. Lo necesito porque permito la descarga directa de muestras de mis libros solo para los miembros de mi lista de correo electrónico; los visitantes habituales obtienen un formulario de registro en su lugar.Qué hay de malo en
? Intenté esto para renderizar un HTML ERB parcial desde dentro de una plantilla de generador Atom y funcionó bien. No es necesario jugar con las variables globales (sí, sé que tienen "@" delante de ellas, pero eso es lo que son).
Sin embargo, su
with_format &block
enfoque es genial y tiene la ventaja de que solo especifica el formato, mientras que el enfoque simple especifica el motor de plantilla (ERB / builder / etc.) también.fuente
baz.en.html.erb
,baz.fr.html.erb
) y desearender :partial
una lógica para elegir la correcta (con alternativas, etc.).DEPRECATION WARNING: Passing a template handler in the template name is deprecated. You can simply remove the handler name or pass render :handlers => [:erb] instead.
foo.baz.html.[your_string]
lugar defoo.baz.[your_string]
. La respuesta de zgchurc es una mejor solución.Para Rails 3, el bloque with_format funciona, pero es un poco diferente:
fuente
Rails 4 te permitirá pasar un parámetro de formatos. Para que puedas hacer
Tenga en cuenta que puede hacer algo similar en Rails 3, pero no pasaría ese formato a ningún subparcial (si el formulario llama a otros parciales).
Puede tener la capacidad de Rails 4 en Rails 3 creando config / initializers / renderer.rb:
Ver http://railsguides.net/2012/08/29/rails3-does-not-render-partial-for-specific-format/
fuente
Sobre la base de la respuesta de roninek , he encontrado que la mejor solución es la siguiente:
en /app/helpers/application.rb:
En /app/views/foo/bar.json:
Una solución alternativa sería redefinir
render
para aceptar un:format
parámetro.No pude llegar
render :file
a trabajar con los lugareños y sin algunas dificultades en el camino.fuente
En Rails 3, la Vista tiene una matriz de formatos, lo que significa que puede configurarla para buscar [: mobile,: html]. Configuración predeterminada para buscar: plantillas móviles, pero recurrir a: plantillas html. Los efectos de configurar esto caerán en cascada en parciales internos.
La mejor manera, pero aún defectuosa, que pude encontrar para configurar esto fue poner esta línea en la parte superior de cada plantilla móvil completa (pero no parciales).
El defecto es que tienes que agregar esa línea a varias plantillas. Si alguien conoce una forma de configurar esto una vez, desde application_controller.rb, me encantaría saberlo. Desafortunadamente, no funciona agregar esa línea a su diseño móvil, porque las plantillas se representan antes que el diseño.
fuente
Simplemente explicando lo que escribió zgchurch:
Pensé que podría ser útil.
fuente
Tienes dos opciones:
1) uso
render :file
2) cambie el formato de la plantilla a html configurando la variable @template_format
fuente
Tenía un archivo llamado 'api / item.rabl' y quería renderizarlo desde una vista HTML, así que tuve que usar:
render file: 'api/item', formats: [:json]
(
file
porque el archivo no tiene guión bajo en el nombre,formats
y noformat
(y pasa y matriz))fuente
Parece que pasar una
formats
opción la renderizará correctamente en la versión más reciente de Rails, al menos 3.2:fuente
Me encontré con este hilo cuando intentaba renderizar un XML parcial en otro archivo de vista xml.builder. Lo siguiente es una buena manera de hacerlo.
Y sí ... El nombre de archivo completo también funciona aquí ...
fuente