2012-02-17 13 views
11

Tengo un controlador de rieles con dos acciones definidas: index y show. Tengo una variable de instancia definida en index acción. El código es algo parecido a continuación:Misma variable de instancia para todas las acciones de un controlador

def index 
    @some_instance_variable = foo 
end 

def show 
    # some code 
end 

¿Cómo puedo acceder al @some_instance_variableshow.html.erb en plantilla?

Respuesta

10

A menos que esté procesando show.html.erb desde la acción index, también deberá configurar @some_instance_variable en la acción show. Cuando se invoca una acción de controlador, llama al método de coincidencia, por lo que no se invocará el contenido de su método index al utilizar la acción show.

Si necesita @some_instance_variable conjunto que es lo mismo, tanto en las acciones index y show, la forma correcta sería definir otro método, llamado por tanto index y show, que establece la variable de instancia.

def index 
    set_up_instance_variable 
end 

def show 
    set_up_instance_variable 
end 

private 

def set_up_instance_variable 
    @some_instance_variable = foo 
end 

Hacer el set_up_instance_variable método privado evita que sea llamado como una acción de controlador si tiene rutas comodín (es decir, match ':controller(/:action(/:id(.:format)))')

+1

Gracias @Emily. ¿Pero hay una forma de DRY-er de hacer esto? – Red

+0

Gracias @Emily estaba buscando lo mismo. ¡Aclamaciones! – Aashish

+0

Simplemente agregue 'before_action: set_up_instance_variable, only: [: show,: index]' al controlador. Eso ejecutará 'set_up_instance_variable' antes de las acciones que especifique. – domi91c

52

Puede definir variables de instancia para varias acciones mediante el uso de un filtro antes de, por ejemplo .:

class FooController < ApplicationController 
    before_filter :common_content, :only => [:index, :show] 

    def common_content 
    @some_instance_variable = :foo 
    end 
end 

ahora @some_instance_variable será accesible desde todas las plantillas (incluyendo parciales) prestados a los index o show acciones.

+4

Esta es una respuesta mejor! –

+0

Muy seco. ¡Bonito! – Red

+0

@Mori ¿Qué le parece si decide colocar el método/objeto en un espacio privado o protegido o público? ¡Gracias! – Red

Cuestiones relacionadas