Pregunta

Necesito hacer esto para un controlador que usa el active_scaffold joya. Tenemos un controlador que se parecía a esto:

class Admin::UsersController < ApplicationController
   layout 'admin'

   active_scaffold :users do |config|
     config.search.columns = [:first_name, :last_name]
   end
end

Eso funcionó muy bien cuando estábamos en Rails 2.3.10, pero estamos actualizando a Rails 3.0.10. Como parte de la actualización, tuve que actualizar active_scaffold (actualmente instalado desde el rails-3.0 rama de git://github.com/activescaffold/active_scaffold) ser compatible. Un problema que estábamos teniendo es que buscar en la mesa no funcionaba. Vería en mis archivos de registro:

Rendered <snip>/gems/active_scaffold-25b3d724f35b/frontends/default/views/list.js.rjs within layouts/admin (923.5ms)

Observe que está representando la plantilla RJS con el diseño especificado en el controlador. Eso me parece un incumplimiento irrazonable. ¿No deberían renderizar las plantillas de RJS? sin que un diseño por defecto? De todos modos, lo arreglé como tal:

class Admin::UsersController < ApplicationController
  layout :admin_layout

  private

  def admin_layout
    respond_to do |format|
      format.js   { false }
      format.html { 'admin' }
    end
  end
end

Eso soluciona los problemas con la búsqueda y la paginación. (La plantilla RJS ahora se representa sin un diseño, por lo que el navegador puede ejecutar el JavaScript resultante). Supongo que mi pregunta es, ¿por qué tengo que decirle a Rails que no debería representar las plantillas de RJS con diseños? ¿Y hay una mejor solución? Esto se siente como un gran truco para mí (el mal tipo de truco, el tipo de truco que se romperá en el futuro).

¿Fue útil?

Solución

Bien, lo descubrí. @Numbers1311407 El comentario de mi pregunta me llevó a verificar el nombre de la plantilla de diseño. Fue layouts/admin.haml. Con Rails 2, ese diseño solo era renderizado para las solicitudes HTML, pero con Rails 3 se aplica a todas las solicitudes (porque no especifica un tipo de formato). Lo renombré para layouts/admin.html.haml y funciona con un simple layout 'admin' en mi controlador (a diferencia del truco que se me ocurrió en mi pregunta).

Entonces, la respuesta a la pregunta: "¿Por qué Rails representa las plantillas RJS dentro de un diseño?" es que el archivo de diseño se nombró de tal manera que se aplica a todos los formatos.

Otros consejos

Responde a tus quastiones:
1. No hay magia para que los renderizadores de Rails funcionen para el formato JS. Eso es por defecto que los rieles representen el diseño con cualquier plantilla a menos que lo diga explícitamente que lo evite. Puede buscar fuentes de rieles en el archivo: actionpack/lib/action_controller/metal/renderers.rb Para ver: JS Renderer.

2. Try para usar:

respond_to do |format|
  format.js { render *your_any_options*, layout: false }
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top