tutorial rails guide guias generate create ruby-on-rails layout initialization

ruby-on-rails - guias - ruby rails guide



¿Se inicializará romper la configuración de diseño en los rieles? (2)

En uno de los controladores, necesito un diseño específico. Añadí layout al principio. Funciona bien.

Pero si agrego una función de initialize para alguna variable basada en controlador. Rails parece simplemente ignorar el comando de layout .

¿Alguien tiene el mismo problema? ¿Cómo puedo arreglarlo?

class AdminsController < ApplicationController layout "layout_admins" def initialize @Title = "Admins" end def index ....... some code here end end


No estoy seguro de cómo funciona exactamente el layout , pero estoy dispuesto a apostar que está en un bloque de rendimiento en el método de Inicialización de ActionController #. Así que su anulación de inicialización explicaría el problema.

Parece que tienes demasiadas opciones aquí:

  1. Cierre su nueva definición con super para llamar a la inicialización de ActionController que debe usar el diseño definido en la clase.

    p.ej:

    def initialize @Title = "Admins" super end

  2. Use un filtro antes para inicializar sus variables. Este es el modo Rails de inicializar valores en un controlador.

    class AdminsController < ApplicationController layout "layout_admins" before_filter :set_title def set_title @Title = "Admins" end def index ....... some code here end end


initialize se usa internamente en Rails para, bueno, inicializar una nueva instancia de su controlador para que luego pueda atender sus solicitudes. Al definir este método de esta manera particular, estás rompiendo Rails .

¡Hay un camino a través de! Una luz al final del túnel. Una olla de oro al final del arco iris:

def initialize @title = "Admins" super end

¿Ves esa pequeña super llamada allí? Eso llamará al método de initialize la superclase, haciendo exactamente lo que Rails haría de otra manera. Ahora que hemos cubierto cómo hacerlo a su manera, vamos a cubrir cómo hacerlo a la manera "oficialmente sancionada" Rails :

class AdminsController < ApplicationController before_filter :set_title # your actions go here private def set_title @title = "Title" end end

Sí, es un poco más de código, pero resultará en menos frustración por parte de otros que miran su código. Esta es la forma convencional de hacerlo y recomiendo encarecidamente seguir las convenciones en lugar de hacer "magia".

EDITAR: Si está usando Rails 5, entonces necesitará usar before_action lugar de before_filter .