2009-12-18 11 views
10

Mam następujący kodRuby on Rails problemem to_json z: include

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

(prawdopodobnie nie najlepszy DB tabeli Desing ale to co muszę używać)

The Asset.first działa poprawnie i przynosi powrót dane poprawnie, ale gdy próbuję użyć tego samego :include w metodzie to_json nie powiedzie się z powodu błędu poniższych:

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

w to_json metoda ma tę samą składnię co :include jako find; Nie rozumiem, dlaczego to nie działa.

Odpowiedz

23

na wypadek gdyby ktoś inny prowadzi do dziwacznej podobnych problemów, które zrobiłem ... to_json również zwróci ten błąd, gdy spróbujesz dołączyć powiązanie, które nie jest zdefiniowane w modelu.

8

Myślę, że składnia to_json: include to trochę inaczej.

zwykle zrobić

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

(i zacząć jeden mały następnie dodać wszystkie inne rzeczy. Irytujące schemat!)

2

miałem ten problem, kiedy overrided funkcję as_json

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

jakiegoś powodu podczas wywoływania as_json lub to_json na tablicy bez argumentów opcje stały się zerowe.

Rozwiązaniem jest:

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

mam ten błąd, gdy próbuje mieszać 1. i 2-go rzędu w relacji jednego połączenia to_json. Oto co miał pierwotnie:

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

który rzuca „niezdefiniowanej metody` makro”dla zera: NilClass” wyjątek powyżej.

Oto jak naprawiłem go:

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

Array będzie pracować dla relacji jednego rzędu, ale dla drugich związkach porządkowych, obiekt zawierający musi być Hash.

+1

Dzięki Mike.It pracował dla mnie. –