2012-01-09 13 views
5

estoy haciendo una aplicación de comercio electrónico en la que las categorías son visibles en la barra lateral en todas las páginas. i escribió un método en el controlador de aplicaciónQuiero crear un método que estará disponible en todos los controladores, y vistas

def categories 
    @categories = Category.all 
end 

pero ¿cómo puedo hacer que este método disponible para todos los controladores y acciones por defecto, así que no tengo que llamar específicamente este método en cada acción

def list 
    categories 
    @products = Product.order('title').page(params[:page]).per(4) 
end 
+0

definen ese método en application_controller y después de la aplicación de definición de controlador añadir 'helper_method: categories' (lo que quiere que se llama' helper_method') – cristian

Respuesta

10

Usted puede definir su método en application_controller.rb y dado que todos los demás controladores heredan de este, ese método estará disponible para todos los controladores. Además, para que sea un método auxiliar para que esté disponible en las vistas, puede decir helper_method :my_method en el application_controller.rb.

Ahora, para que se evalúe automáticamente antes de cualquier otra acción en un controlador, puede usar un before_filter. Añadir before_filter :my_method del controlador que desea que este método se evalúa antes de cualquier acción o en el application_controller.rb

0

Si usted quiere algo que tiene que ser en toda la aplicación, como en este caso: @categorias , luego escribe un ayudante.

en app/helpers/application_helper.rb

module ApplicationHelper 
    def get_all_categories 
    @categories = Category.all 
    end 
end 
-2

yo no lo que hay una manera de ejecutar este mundial. Puede ejecutarlo en un before_filter por lo que se llama antes de cada acción, pero debe especificarlo en cada controlador de nuevo.

Mi sugerencia sería la de poner las cosas en una categoría barra lateral parcial que contiene una llamada como esta:

<% Category.all.each do |category| %> 
    <% do stuff to display all categories %> 
<% end %> 

entonces se podría simplemente añadir la llamada a su renderlayout/application.html.erb que lo haga por usted!

+1

'podría ejecutar en un before_filter por lo que su llamada antes de cada acción, pero debe especificar esto en cada controlador nuevamente ... ... Si coloca un 'before_filter' en el ApplicationController, no tiene que volver a especificarlo en cada acción del controlador (ya que de manera predeterminada heredan los filtros). Además, estás haciendo llamadas modelo en las vistas, lo que nunca es algo bueno. Sea fácil de pronunciar la palabra f. – iwasrobbed

+0

No es un problema hacer una llamada 'all' en la vista; está bien llamar a Métodos en el modelo siempre que no haya lógica en él que pertenezca al' modelo' o al 'controlador'. – davidb

+0

Creo que algo como esto definitivamente pertenece a la vista, posiblemente como ayudante. Agregaría <% cache ('sidebar_categories') do%> a su alrededor y una actualización a una categoría de barra lateral invalidaría esto. – sunkencity

Cuestiones relacionadas