2009-12-18 5 views
10

J'ai le code suivantRuby on Rails problème to_json avec: comprennent

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

(probablement pas la meilleure desing table de DB, mais qui est ce que je dois utiliser)

correctement Asset.first fonctionne et il apporte Retour correctement les données, mais lorsque je tente d'utiliser la même :include dans la méthode to_json il échoue avec l'erreur de followings:

@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): 

le to_json méthode a la même syntaxe :include comme trouver; Je ne comprends pas pourquoi ça ne marche pas.

Répondre

23

au cas où quelqu'un court d'autre dans une question connexe bizarre que je l'ai fait ... to_json renvoie également cette erreur lorsque vous essayez d'inclure une association qui n'est pas définie sur le modèle.

8

Je pense que la syntaxe to_json: include est un peu différente.

que je fais habituellement

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

(et commencer par un petit puis ajouter tous les autres trucs. Schéma ennuyeux!)

2

J'ai eu ce problème quand j'overrided la fonction as_json

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

pour une raison quelconque lorsque vous appelez la as_json ou to_json sur un tableau sans arguments les options sont devenues nulles.

Le correctif est:

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

J'ai eu cette erreur en essayant de mélanger 1er et 2e relations d'ordre en un seul appel to_json. Voici ce que j'avais à l'origine:

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

qui lance la « méthode non définie macro » pour nulle: NilClass » exception ci-dessus.

Voilà comment je l'ai fixé:

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

Array fonctionnera pour les relations unique d'ordre, mais pour la deuxième relation d'ordre, l'objet contenant doit être un Hash.

+1

Merci Mike.Il a travaillé pour moi. –