Rails: establezca una variable de instancia común en varias acciones del controlador
¿Cómo se deben tener varias acciones de controlador diferentes para establecer una variable de instancia comúnpara usar en plantillas pero después de que la acción se ejecute.
n otras palabras, quiero que esto funcione en mi application_controller.
class ApplicationController < ActionController::Base
after_filter :set_something_common
def set_something_common
# All controllers' actions have queried the DB and set @foo for me...
@bar = some_calculation_on(@foo)
# ... and all templates expect @bar to bet set.
end
end
EstaNo funcion porqueafter_filter
se ejecuta después del renderizado. Multa. ¿Pero cuál es el patrón correcto?
De nuevo, es importante queset_something_common
se ejecuta después de la acción porque esas acciones hacen cosas específicas del caso; pero todos establecieron@foo
.
Ninguna de mis ideas parece ideal:
Llamadaset_something_common()
hacia el fondo de cada acción que lo necesite.Refactorice el código específico de caso de todos los controladores encase_specific_code()
y obligarlos a correr en orden:
before_filter :case_specific_code, :set_something_common
Subclassapplication_controller
y redefinir elindex
método.
¿Alguna idea? Gracias
Edit: la respuesta de Matthew me llevó a aclarar: Varios índices de controladores () todos hacen paginación, cada uno tomando parámetros@offset
y@limit
(a través de una @ globbefore_filter
) para ver segmentos de datos. Excelente. Ahora quiero un método común para calcular una URL RESTful para el enlace "siguiente segmento". Me animaron a ver queurl_for()
genera una URL que vuelve al mismo recurso, así que intenté:
def set_something_common # really called set_next_url, truth be told
@next_url = url_for(:offset => @offset + @limit, :limit => @limit)
end
Intentaré parchear mono Fixnum, así que puedo hacer algo como@offset.next_url_for(self, @limit)
de la plantilla, pero no estoy seguro de si funcionará. Ahora que lo pienso, si voy a modificar las plantillas, entonces también podría configurar un asistente de aplicación. Todavía no estoy seguro de cuál es la mejor solución.
Gracias por las actualizaciones de todos. Aprendí mi lección de que los ayudantes, como las variables globales, están ahí por una razón y no deben evitarse cuando son claramente beneficiosos y concisos.