¿Cómo puedo renderizar un formato parcial de otro en Rails?

Intento generar una respuesta JSON que incluya algo de HTML. Por lo tanto, tengo /app/views/foo/bar.json.erb :

 { someKey: 'some value', someHTML: " '/foo/baz') -%>" } 

Quiero que /app/views/foo/_baz.html.erb , pero solo mostrará /app/views/foo/_baz.json.erb . Pasar :format => 'html' no ayuda.

A partir de Rails 3.2.3, al invocar render: uso parcial

 :formats => [:html] 

en lugar de

 :format => 'html' 

Qué hay de malo en

 render :partial => '/foo/baz.html.erb' 

? Acabo de probar esto para renderizar un HTML ERB parcial desde dentro de una plantilla de generador Atom y funcionó bien. No se debe perder el tiempo con las variables globales requeridas (sí, sé que tienen “@” frente a ellos, pero eso es lo que son).

with_format &block embargo, su enfoque with_format &block 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.

Para Rails 3, el bloque with_format funciona, pero es un poco diferente:

  def with_format(format, &block) old_formats = formats self.formats = [format] block.call self.formats = old_formats nil end 

Sobre la base de la respuesta de roninek , he encontrado la mejor solución para ser la siguiente:

en /app/helpers/application.rb:

 def with_format(format, &block) old_format = @template_format @template_format = format result = block.call @template_format = old_format return result end 

En /app/views/foo/bar.json:

 <% with_format('html') do %> <%= h render(:partial => '/foo/baz') %> <% end %> 

Una solución alternativa sería redefinir render para aceptar un :format parámetro de :format .

No pude obtener el render :file funcionaba con los locales y sin algunos inconvenientes de ruta.

Rails 4 le permitirá pasar un parámetro de formatos. Entonces puedes hacer

 render(:partial => 'form', :formats => [:html])} 

Tenga en cuenta que puede hacer algo similar en Rails 3, pero no pasaría ese formato a ningún subparticio (si el formulario llama a otros parciales).

Puede tener la capacidad de Rails 4 en Rails 3 creando config / initializers / renderer.rb:

 class ActionView::PartialRenderer private def setup_with_formats(context, options, block) formats = Array(options[:formats]) @lookup_context.formats = formats | @lookup_context.formats setup_without_formats(context, options, block) end alias_method_chain :setup, :formats end 

Ver http://railsguides.net/2012/08/29/rails3-does-not-render-partial-for-specific-format/

En Rails 3, View tiene una matriz de formatos, lo que significa que puede configurarlo para que busque [: mobile,: html]. Configuración que buscará de forma predeterminada: plantillas móviles, pero retroceda a: plantillas html. Los efectos de configurar esto se dividirán 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).

 <% self.formats = [:mobile, :html] %> 

El error es que debes agregar esa línea a múltiples plantillas. Si alguien sabe cómo configurar esto una vez, desde application_controller.rb, me encantaría saberlo. Lamentablemente, no funciona agregar esa línea a su diseño móvil, porque las plantillas se representan antes del diseño.

Solo elaborando sobre lo que escribió zgchurch:

  • teniendo en cuenta las excepciones
  • devolviendo el resultado del bloque llamado

Pensé que podría ser útil.

 def with_format(format, &block) old_formats = formats begin self.formats = [format] return block.call ensure self.formats = old_formats end end 

Tienes dos opciones:

1) use render: file => “foo / _baz.json.erb”

2) cambie el formato de la plantilla a html configurando @template_format variable

 <% @template_format = "html" %> <%= h render(:partial => '/foo/baz') %> 

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 guiones bajos en el nombre, formats y no format (y pasa y matriz))

Parece que pasar una opción de formats lo renderizará correctamente en la versión más nueva de Rails, al menos 3.2:

 { someKey: 'some value', someHTML: "<%= h render('baz', formats: :html) -%>" } 

Me encontré con este hilo cuando estaba tratando de hacer un XML parcial en otro archivo de vista xml.builder. Lo siguiente es una buena manera de hacerlo

 xml.items :type => "array" do @items.each do |item| xml << render(:partial => 'shared/partial.xml.builder', :locals => { :item => item }) end end 

Y sí … El nombre completo del archivo también funciona aquí …