2009-12-18 18 views
10

Tengo el siguiente códigoRuby on Rails problema a_json con: incluyen

@asset = Asset.first(
    :include => [ 
    :asset_statuses => [ 
     :asset_status_name, 
     {:asset_location => [ 
     {:asset_floor => :asset_building} 
     ]} 
    ], 
    :asset_type => [ 
     :asset_category => :asset_department 
    ] 
    ], 

(probablemente no es la mejor mesa el desing DB pero eso es lo que tengo que usar)

Los Asset.first funciona correctamente y que trae espalda los datos correctamente, pero cuando trato de usar el mismo :include en el método to_json falla con el error siguientes:

@asset.to_json( 
    :include => [ 
    :asset_statuses => [ 
     :asset_status_name, 
     {:asset_location => [ 
     {:asset_floor => :asset_building} 
     ]} 
    ], 
    :asset_type => [ 
     :asset_category => :asset_department] 
    ] 
) 

NoMethodError (undefined method `macro' for nil:NilClass): 

el 0 El métodotiene la misma sintaxis :include que "find"; No entiendo por qué no está funcionando.

Respuesta

23

En el caso de cualquier otra persona se encuentra con un problema relacionado extraño que hice ... to_json también devolverá este error cuando intente incluir una asociación que no está definida en el modelo.

8

Creo que el to_json: incluir la sintaxis es un poco diferente.

por lo general lo hago

@asset.to_json(:include => { :asset_statuses => { 
          :include => :asset_status_name}}) 

(y empezar con una pequeña continuación, añadir todas las otras cosas. Molesto esquema!)

2

he tenido este problema cuando overrided la función as_json

def as_json(options={}) 
    if options[:admin] 
    super(:methods => [:url_thumb]) 
    else 
    super(options.merge(:only => :id)) 
    end 
end 

por alguna razón cuando se llama a la as_json o a_json en una matriz sin argumentos las opciones se convirtieron nula.

La solución es:

def as_json(options={}) 
    options = {} if options.nil? 
    if options[:admin] 
    super(:methods => [:url_thumb]) 
    else 
    super(options.merge(:only => :id)) 
    end 
end 
7

Tengo este error al intentar mezclar primero y las relaciones de 2º orden en una sola llamada a_json. Esto es lo que originalmente tenía:

render :json => @reports.to_json(:include => 
    [:report_type, :organisation, :analysis => {:include => :upload}] 

que arroja el "indefinido método` macro' para nada: NilClass" excepción anteriormente.

Así es como me fijo:

render :json => @reports.to_json(:include => 
    {:report_type => {}, :organisation => {}, 
    :analysis => {:include => {:upload => {}}}}) 

La matriz de relaciones de trabajo para una sola orden, pero para las relaciones de segundo orden, el objeto que contiene es necesario que haya un hash.

+1

Gracias Mike.Fue útil para mí. –