2012-01-04 53 views
0

Ruby/Rails的新功能,請耐心等待。'as_json'中的類方法不適用於索引操作

我有一個ActiveRecord模型類狀態。我將它渲染爲json以用於移動web應用程序。它由一個id,名稱,代碼和back_color(十進制顏色)組成。我需要從BGR十進制到RGB十六進制進行顏色轉換,所以我決定使用顏色寶石。但最終,我認爲我的方法定義的基本問題。

當我要求一條記錄(/statuses/1.json)時,一切都按預期工作。當我索要索引(/statuses.json)時,出現內部服務器錯誤(500)。最詳細的我已經能夠從獲得是ArgumentError (ArgumentError)

我定義的方法做,像這樣的轉換:

def color_hex 
bgr = Color::RGB.from_html(back_color.to_s(16)) #converts dec to hex, then creates new color object from it 
rgb = Color::RGB.new(bgr.blue,bgr.green,bgr.red) #swaps red & blue into new color object 
rgb.html #outputs rgb hex for use in html 
end 

我也包含在模型的自定義as_json,加入color_hex方法:

def as_json(options={}) 
    super(:methods => :color_hex) 
end 

從我的控制器,我使用標準format.json { render :json => @statuses }

正如我所說,我認爲這是一個基本問題,所以我簡化了方法作爲概念驗證:我至少可以操縱back_color嗎?

def color_hex 
back_color * -1 
end 

...它適用於展示和索引操作。只要我以任何身份介紹彩色寶石,它都不起作用。再次,我將這歸因於我如何使用寶石,而不是寶石本身的問題。

我忽視了什麼核心原則?

TL,DR:我渲染爲json,我的自定義方法正在爲show動作而不是索引動作。

+0

您的log/development.log文件中是否有更多詳細信息?難道是你的數據庫中的一個狀態有錯誤的數據(例如,它不再是'Color :: RGB.from_html'的有效輸入) – 2012-01-04 20:13:44

+0

@FrederickCheung我對這裏的禮節不確定......我我希望將此標記爲已回答,但我不想將您的「代表」帶走。你可以發表你的評論作爲答案? – Tim 2012-01-04 21:30:55

+0

當然,已經發布了它。 – 2012-01-04 22:03:57

回答

1

難道在你的數據庫中的一種狀態有壞的數據(例如,它不再是Color::RGB.from_html有效輸入)?這會導致加載整個集合的操作引發錯誤,但不會導致大多數單個問題出現問題。

+0

** facepalm ** - 現在看起來很明顯,你已經說過了。事實上,它似乎是一個數據問題。嘗試加載第7條記錄的單個實例會導致同樣的問題!我相信對數據的額外檢查(在Color :: RGB.from_html之前)將是這裏的解決方案。謝謝@FrederickCheung! – Tim 2012-01-04 22:43:50

-1

你只需要重新命名as_json方法爲to_json

def to_json(options={}) 
    super(:methods => :color_hex) 
end 
+0

雖然我一直在閱讀,我應該避免'to_json'支持'as_json',我給它一個鏡頭。行爲是一樣的。它適用於單一(顯示)操作,但不適用於全部(索引)操作。 – Tim 2012-01-04 19:20:15

相關問題