2013-10-25 80 views
3

我有一個Rails API,用於RABL將JSON發送回客戶端。我需要爲Question模型提供showindex操作。在這個例子中,一個Question has_many Answers.Rails JSON API,如何處理RABL中的零對象?

你如何處理RABL中的零對象?該API拋出錯誤,因爲我在question對象nil(傳入的question_id不存在)上調用.answers

我可以用if像下面這樣一個question不存在會不會導致錯誤包裹Rabl的協會組成部分,

# questions/show.rabl 
object @question 
attributes :id, :text 

node(:answer_id) do |question| 
    if question != nil  # <-- This if keeps the .answers from blowing up 
     answer = question.answers.first 
     answer != nil ? answer.id : nil 
    end 
end 

但是,後來當我打電話/api/questions/id_that_doesn't_exist我得到這個返回:{answer_id:null}而不僅僅是{}

我試圖在if這樣環繞整個節點元素,

if @question != nil # <-- the index action doesn't have a @question variable 
    node(:answer_id) do |question| 
     answer = question.answers.first 
     answer != nil ? answer.id : nil 
    end 
end 

但後來我index行動將不會返回node(:answer_id)因爲@question從集合調用當它不存在。

有沒有辦法讓這兩種行爲?

# questions/index.rabl 
collection @questions 

extends "questions/show" 
+0

怎麼樣有if語句在控制器和明確在那裏渲染空對象? – j03w

+0

這似乎有點冒失,但它確實使錯誤消失。如果我返回'{}'如果對象爲零,我會從調用中返回'[]'。這可能是一個比錯誤更好的解決方案。 – jmosesman

回答

3

我實際上在RABL文檔中找到答案,試圖解決另一個問題。

您可以添加:unless塊,以保持它炸燬試圖nil對象上訪問屬性:

# questions/show.rabl 
object @question 
attributes :id, :text 

node(:answer_id, unless: lambda { |question| question.nil? }) do |question| 
    answer = question.answers.first 
    answer != nil ? answer.id : nil 
end 

科文檔:https://github.com/nesquena/rabl#attributes