3

我有一个与 RABL 一起使用的 Rails API,用于将 JSON 发送回客户端。我需要对模型show进行index操作Question。在这个例子中,一个Question has_many Answers.

你如何处理 RABL 中的 nil 对象?API 引发错误,因为我正在调用.answers一个question对象nilquestion_id传入的对象不存在)。

我可以用下面的类似包装 RABL 的关联部分,if这样一个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"
4

1 回答 1

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

于 2013-10-31T05:53:04.720 回答