2013-10-25 1 views
3

У меня есть Rails API, который я использую с RABL для отправки JSON обратно клиенту. Мне нужно иметь действие show и index для модели Question. В этом примере a Question has_many Answers.Rails JSON API, как работать с нолем в RABL?

Как вы относитесь к объекту nil в RABL? API вызывает ошибку, потому что я вызываю .answers на объект question, который является nil (переданный question_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" 
+0

как о есть, если оператор в контроллере и явно показать пустой объект? – j03w

+0

Это кажется немного взломанным, но это заставляет ошибку уйти. Если я верну '' {} ', если объект равен nil, я получаю' [] 'обратно от вызова. Это может быть лучшим решением, чем ошибка. – jmosesman

ответ

3

Я действительно нашел ответ в документации RABL, пытаясь решить другую проблему.

Вы можете добавить :unless блок, чтобы сохранить его от взрыва, пытаясь получить доступ к свойствам на нулевой объект:

# 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