Rails JSON API,如何处理RABL中的nil对象?

时间:2013-10-25 04:15:12

标签: ruby-on-rails ruby json api rabl

我有一个Rails API,我正在使用RABL将JSON发送回客户端。我需要对show模型执行indexQuestion操作。在此示例中,为Question has_many Answers.

你如何处理RABL中的nil对象? API抛出错误,因为我在.answers question对象上调用nil(传入的question_id不存在)。

我可以用下面的if包装RABL的关联部分,这样不存在的question不会导致错误,

# 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"

1 个答案:

答案 0 :(得分: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