Desactivar el diseño para una de las acciones

81

Mi situación: Ver la acción de ReportsController debería representar html puro, pero no como un archivo (para verlo en el navegador y guardarlo después). Entonces, para renderizar, uso la plantilla de vista view.html.erb y necesito desactivar cualquier diseño para esta acción. Pero en otras acciones de este controlador, los diseños deben permanecer intactos. Funciona solo apagándose para todo el controlador como este:

ReportsController < ApplicationController
  layout false

Pero hacerlo mal :( para todas las acciones, intenté usar algo como esto en acción:

def view      
  @report = Report.new(params[:report])
  unless @report.valid?
    render :action => 'new' and return
  else
    render :layout => false     
  end   
end

¿Qué tengo que hacer?

Antiarquitecto
fuente
Bueno, definitivamente no necesitas esa devolución explícita. ¿Quiere que el diseño se represente si el informe es válido?
tfwright

Respuestas:

73

Prueba esto:

ReportsController < ApplicationController
  layout false
  layout 'application', :except => :view
mckeed
fuente
Parece que esta directiva funciona mal (o inesperadamente). Intenté usar algunas combinaciones de estos parámetros (: solo,: excepto). Pero funcionó de manera extraña al eliminar todos los diseños de todas las acciones. Creo que es debido a nil o false en lugar de 'layoutname'. Y el sistema intenta usar diseños de 'nombre de controlador' para todas las demás acciones ignorando el diseño de la aplicación. Intente jugar con estos parámetros y comprenderá de qué se trata todo esto.
Antiarchitect
2
Tienes razón, :onlyno funciona correctamente layout nil. Sin embargo, pude hacer que funcionara anulando el diseño y volviéndolo a agregar con la excepción. Actualicé mi respuesta.
medido el
2
La respuesta de David Ortiz es "más correcta", ya que aísla correctamente el interruptor de diseño de la única acción en cuestión.
Frank Koehl
Estoy de acuerdo con @Paul - false¡funciona! ¡Gracias por eso!
mrstif
layout false, only: :viewparece una forma más concisa de lograr el mismo objetivo sin los efectos secundarios que menciona Antiarchitect.
SMAG
116

Esto debería hacerlo

def view
    ...
    render :layout => false
end

Enlace a la documentación

David Ortiz
fuente
El problema con esto es que tendría que especificar layout: falsepara cada formato en la acción.
JellicleCat
1
¡La vida es hermosa cuando hay respuestas! :-D
Pedro Rolo
11

En el bloque responder, agregue layout: false.

Por ejemplo:

respond_to do |format|
  format.html { render :layout => false } # your-action.html.erb
end
Archonic
fuente
2

Si desea obtener una plantilla no estándar, sin diseño, puede usar:

def non_rest
  render template: 'layouts/something_new', layout: false
end
Mugur 'Bud' Chirica
fuente