Создание вложенного 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.

Но ваша установка и мышление выглядит хорошо.

Другие вопросы по тегам