2011-08-03 6 views
6

Tengo una variable a la que quiero acceder en mi application.html.erb por lo que está disponible para todas las vistas. Sé que puedo entrar y agregarlo a cada controlador y agregarlo a cada función para que esté disponible para indexar, mostrar, etc. Sin embargo, eso es una locura. Si quiero que esté en un encabezado, debería poder acceder a él en el archivo application.html.erb, de modo que esté en todas mis vistas. Un ejemplo de uno de mis reguladores se está trabajando en ...RoR haciendo una variable disponible para application.html.erb por lo que está en todas las vistas en un encabezado

 def index 
    if session[:car_info_id] 
     @current_car_name = current_car.name 
    end 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @miles } 
    end 
    end 

Aquí es mi función en ApplicationController:

private 

    def current_car 
    CarInfo.find(session[:car_info_id]) 
    end 

Si intento agregar @current_car_name = current_car.name a mi modo ApplicationController la variable está disponible para mi application.html.erb bombardea con un error de Enrutamiento a current_car. Sé que la función funciona porque si la llamo en un controlador diferente funciona bien y puedo acceder a la variable producida en esa vista de índice o lo que sea. Solo necesito saber cómo llamar a la función una vez y tener la variable accesible para todas las vistas, ya que estará en mi encabezado. Podría poner la información en una variable de sesión, pero leí en alguna parte que debería limitar las variables de sesión a los ID y generar la otra información necesaria de esos ID.

Gracias de antemano,

+0

No debe hacer que el método sea privado. El controlador de la aplicación es siempre una clase base de otro controlador y, por lo tanto, los métodos privados no estarán disponibles. Los métodos privados de una clase base no están disponibles en la subclase. Aparte de esto, te recomiendo que sigas el consejo de Dylan Markow. – Mischa

Respuesta

11

Sólo tiene que añadir una línea como esta a su archivo application_controller.rb y tendrá acceso a current_car en sus puntos de vista.

helper_method :current_car 

Si realmente quería una variable de instancia, se podría poner un before_filter en la aplicación de la siguiente manera. Entonces, tanto sus controladores como sus vistas tendrán acceso a la variable @current_car.

class ApplicationController < ActionController::Base 
    before_filter :get_current_car 
    def get_current_car 
    @current_car = CarInfo.find(session[:car_info_id]) 
    end 
end 
+0

Gracias. Hice la opción uno y funcionó. ¿Hay alguna razón por la que sepa usar una opción sobre la otra? – Xaxum

+6

@Xaxum Esta respuesta llega casi un año tarde, pero para cualquier visitante futuro: se invocan helper_methods cada vez que se usan en la vista, mientras que before_filters se llaman una vez antes de que se ejecute la vista. Utilizaría un before_filter para esto, así no tendremos que seguir buscando el CarInfo varias veces. – mpdaugherty

Cuestiones relacionadas