2011-01-12 14 views
21

En mi controlador Tengo el siguiente código simplificado:El uso de estructuras en Ruby on Rails da la asignación dinámica constante (SyntaxError)

def index 
    @dashboard_items = [] 
    DashItem = Struct.new(:name, :amount, :moderated) # Error is here 

    [:page, :post].each do |c| 
    obj = c.to_s.capitalize.constantize 
    @dashboard_items << DashItem.new(c.to_s, obj.count, obj.count_moderated) 
    end 
end 

Pero Rubí da el siguiente error:

dynamic constant assignment (SyntaxError)

en la línea marcado arriba.

Que, AFAIK, significa que la constante DashItem ya está definida. ¿Es esto correcto? ¿Y que hacer al respecto?

+2

nota al margen: array vacío + each + append = map – tokland

+0

posible duplicado de [Asignación dinámica constante] (http://stackoverflow.com/questions/6712298/dynamic-constant-assignment) –

Respuesta

45

El error explica cuál es el problema: tiene una constante asignada en un contexto que es demasiado dinámico, es decir, dentro del método de índice.

La solución es definir fuera:

DashItem = Struct.new(:name, :amount, :moderated) 
def index 
    @dashboard_items = [] 
    ... 
+6

No es realmente un error autoexplicativo. .. – Mirko

11

Si desea mantener todo el asunto cuidadosamente dentro de su método de índice que podría hacer esto:

def index 
    @dashboard_items = [] 
    # Set the name of your struct class as the first argument 
    Struct.new('DashItem', :name, :amount, :moderated) 
    ... 
    # Then when you want to create an instance of your structure 
    # you can access your class within the Struct class 
    @dashboard_items << Struct::DashItem.new(c.to_s, obj.count, obj.moderated) 
end 

Como dijo Gunn, que acaba no se puede asignar explícitamente una constante dentro de un método como ese ...

Esta solución se explica más en los documentos de ruby ​​here, segundo ejemplo en la página.