Pregunta

Estoy tratando de 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 muestre /app/views/foo/_baz.html.erb , pero solo mostrará /app/views/foo/_baz.json.erb. Pasando : format = > 'html' no ayuda.

¿Fue útil?

Solución 5

Basándose en roninek's respuesta , he encontrado que la mejor solución es 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 parámetro : format .

No pude hacer que render: file trabaje con los locales y sin cierta incertidumbre de ruta.

Otros consejos

Comenzando con Rails 3.2.3, cuando se llama render: parcial (solo funciona fuera del bloque respond_to ).

:formats => [:html]

en lugar de

:format => 'html'

¿Qué le pasa a

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

? Acabo de intentar esto para representar 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).

Su es genial y tiene la ventaja de que solo se especifica el formato, mientras que el enfoque simple también especifica el motor de plantillas (ERB / ??builder / etc).

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

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 sub parcial (si el formulario llama a otros parciales).

Puede tener la habilidad 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, la Vista tiene una matriz de formatos, lo que significa que puede configurarla para que busque [: mobile,: html]. Configuración predeterminada para buscar: plantillas móviles, pero recurrir a: plantillas html. Los efectos de establecer esto se convertirá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] %>

La falla es que tienes que agregar esa línea a varias plantillas. Si alguien sabe 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 del diseño.

Simplemente explicando 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: archivo

render :file => "foo/_baz.json.erb"

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

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

Tenía un archivo llamado 'api / item.rabl' y quería representarlo desde una vista HTML, así que tuve que usar:

render file: 'api / item', formatos: [: json]

( file porque el archivo no tiene guión bajo en el nombre, formatos y no format (y pasa y matriz))

Parece que pasar una opción de formatos lo hará correctamente en la versión más reciente de Rails, al menos 3.2:

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

Me encontré con este hilo cuando estaba tratando de representar 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í ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top