Как ответить_с несколькими объектами в Rails 3.1 - PullRequest
4 голосов
/ 20 сентября 2011

У меня есть маршрут, например

POST /interaction.json

, где клиент публикует новое взаимодействие.Обычно мой контроллер будет выглядеть как

class InteractionController < ApplicationController

    def create
        respond_with @log
    end

end

, и я получу ответ json

{ "log" : { "id" : 20, .... } }

и заголовок местоположения будет установлен на

http://foo.com/log/20

Однако, если яЯ хочу вернуть больше объектов в моем ответе: json, чем просто @log.Например, чтобы уведомить клиента, что что-то изменилось по отношению к этому взаимодействию нормальному.Возможно, пользователь выиграл приз за это взаимодействие.Было бы неплохо иметь возможность сделать

response_with @log, @prize

и получить ответ

{ "log": { "id": 20, ... },
  "prize": { "id": 50, ...}
}

, но это не так, как работает response_with.Он рассматривает @prize как вложенный ресурс @log.Кто-нибудь может предложить идею для этого?

Ответы [ 2 ]

9 голосов
/ 09 декабря 2011

Объединение двух независимых объектов опасно и переопределяет любые существующие атрибуты в вызывающей стороне.

Вместо этого вы всегда можете обернуть объекты и вместо них ответить оберткой:

@response = {:log => @log, :price => @price}
respond_with @response
1 голос
/ 20 сентября 2011

Предполагая, что @log и @prize - оба хэша, вы можете объединить оба хэша и вернуть слияние.

respond_with @log.merge(@prize)

Я думаю, что может перезаписать @log.id на @prize.id.Можете попробовать что-то еще, если это так.

...