2009-12-18 59 views
10

我有以下代碼Ruby on Rails的to_json問題:包括

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

(可能不是最好的數據庫表德興但是,這就是我必須使用)正確

Asset.first作品和它帶來的回到正確的數據,但是當我嘗試在to_json方法失敗與以下錯誤使用相同的:include

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

to_json方法與find相同的語法:include;我不明白爲什麼它不起作用。

回答

23

萬一別人運行到,我做了一個奇怪的相關問題... to_json也會在您嘗試包含未在模型中定義的關聯時返回此錯誤。

8

我認爲to_json:包含語法有點不同。

我通常做

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

(並開始與一個小再加入所有的其他的東西。惱人的模式!)

2

我有這個問題時,我overrided的as_json功能

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

出於某種原因,當你不帶參數的選項成爲零致電as_json或to_json陣列上。

修復的方法是:

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

試圖在一個單一的to_json呼叫混合階和二階的關係,當我得到這個錯誤。這是我原來的:

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

其中拋出「未定義的方法宏」的nil:NilClass「異常上面。

以下是我固定它:

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

陣列將用於單階關係的工作,但對於二階關係,包含的對象必須是一個Hash。

+1

感謝Mike.It爲我工作。 –