Создание вложенного JSON-запроса с Rails
У меня немного сложная ситуация. Я создаю приложение для iPhone с бэкэндом рельсов. Есть два модельных объекта, сеанс чата и человек. Они определены следующим образом:
class Person < ActiveRecord::Base
belongs_to :chatsession
end
class Chatsession < ActiveRecord::Base
has_many :people
belongs_to :leader, :class_name => "Person"
end
Лидер по сути является основным человеком для этого конкретного сеанса чата. Теперь из моего приложения для iPhone я хочу иметь возможность создавать Chatsession с лидером за один вызов (обычно сетевые вызовы на iPhone стоят дорого, и поэтому я хочу избежать создания объекта Person, а затем объекта сеанса).
Возможный JSON-запрос может выглядеть так:
{"chatsession": {"leader": {"name":"mary","device_id":"1111"}}}
На моем контроллере chatsession в методе create я хочу иметь возможность использовать этот JSON и создать как новый объект сеанса чата, так и связанный объект person.
Соответствующий код для этого будет:
class ChatsessionController < ApplicationController
def create
@chatsession = Chatsession.new(params[:chatsession])
end
В моем функциональном тесте он работает со следующим кодом:
test "should create session" do
# people(:one) is retrieving from a fixture
post :create, :chatsession => { :leader => people(:one) }
assert_response :success
end
Это прекрасно работает. Но создать эквивалент JSON, похоже, не работает. Он ожидает какой-то объект Person, и я не знаю, как это представить. Я посмотрел на следующий способ решения проблемы.
http://www.rogue-development.com/blog2/2009/05/creating-nested-objects-with-json-in-rails/
Это лучшее решение или я что-то упустил?
2 ответа
Пост выглядит как отличное решение для меня.
С какой частью у вас проблемы?
Rails 2.1 и выше автоматически обрабатывает входящие JSON-запросы. Просто убедитесь, что ваше приложение для iPhone устанавливает тип пантомимы на json. Смотрите пост, в котором также обсуждается тестирование входящего JSON в постах.
Пара указателей:
Убедитесь, что для заголовка "Content-Type" и "Accept" установлено значение "application/json". Проверьте это, просматривая / записывая ваши параметры; если они все установлены правильно, вы можете идти.
Я думаю, что вы хотите иметь
accepts_nested_attributes_for :leader
в вашем чатеВозможно, вам придется обойти токен аутентификации; ваш iPhone не будет отправлять его, и по умолчанию rails ищет его в операциях post / put.
Но ваша установка и мышление выглядит хорошо.