2010-12-04 6 views
14

Estoy intentando que un conjunto de variables en el controlador de la aplicación salte al diseño de la aplicación.Rieles: Cómo obtener una variable de controlador de aplicación para el diseño de mi aplicación

si uso:

@var = 'foo' 

... el diseño de la aplicación no sabe lo que estoy hablando

Si utilizo una variable global

$var = 'foo' 

.. . el diseño de la aplicación funciona. Sin embargo, mis pruebas funcionales no funcionan:

# application layout 
# my var is an AR object 
$var.name 

# Stock functional test 
class HomeControllerTest < ActionController::TestCase 
    test "should get index" do 
    get :index 
    assert_response :success 
    end 
end 

# test:functionals 
ActionView::Template::Error: undefined method `name' for nil:NilClass 

necesito a disposición del diseño de la aplicación (cada página) esta var. ¿Pensamientos? ¿Debo hacer esto una sesión de var?

actualización

Sobre la base de algunos otros mensajes que estoy leyendo, que se considera la mejor práctica para colocarlos en el ayudante de aplicación, entonces llamarlos desde el diseño?

# Application helper 
def get_var 
    Product.first 
end 

# Application layout 
<% @var = get_var %> 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
... 

Esto a) funciona en mi navegador yb) pasa las pruebas. ¿Es la mejor práctica? ¿Hay una manera más fácil/mejor?

Respuesta

19

¿Intentó before_filter el método donde se declara la variable para asegurarse de que cada otro controlador la llame y pase la variable a su vista correspondiente?

ApplicationController clase < ActionController :: Base

before_filter: foo_function

def foo_function
@ var = "foo"
final

final

Si es un @var Objeto AR y no una cadena, ¿está seguro de que tiene el nombre del modelo y el nombre de la columna definidos correctamente?

+0

Las variables se configuran sin el before_filter. De hecho, el diseño de la aplicación puede verlos si los configuro como variables globales. Pero a) Estoy tratando de evitar los globales yb) mis pruebas funcionales básicas no tienen idea de ellos (por alguna extraña razón) – jmccartie

1

¿Has probado implementarlo como helper_method?

class ApplicationController < ActionController::Base 
    helper_method :foo, :foo= 

    def foo 
    @var ||= "foo" 
    end 

    def foo=(val) 
    @var = val 
    end 
end 
+0

¿Qué ventaja tiene esto sobre tenerlos en el asistente de aplicación? Sé que al hacerlo, se puede llamar desde cualquier lugar, pero en este caso, todo lo que necesito es que esté disponible para el diseño de la aplicación – jmccartie

+0

Si realmente solo lo necesita en el archivo de diseño, ambos están bien. Depende de la naturaleza del método, pero no es un gran problema a menos que tenga un proyecto extremadamente complicado. Personalmente, pondría los métodos de formato de salida y sus métodos dependientes en el helper de la aplicación, mientras mantengo a otros en el controlador de la aplicación. – PeterWong

Cuestiones relacionadas