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í:
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
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
.