Как использовать REST для публикации данных GPS с устройства Android в приложении Ruby on Rails? - PullRequest
1 голос
/ 14 апреля 2010

Я студент в процессе создания приложения для Android, которое может публиковать трек GPS в приложении Rails. Я хотел бы сделать вещи "Rails" и воспользоваться REST. На данный момент в моем приложении rails есть 3 модели: пользователи, треки и точки. Пользователь has_many отслеживает, а отслеживает has_many очки. Трек также имеет общую дистанцию. Точки имеют широту и долготу. Я успешно смог создать пустой трек с:

curl -i -X POST -H 'Content-Type: application/xml' -d '<track><distance>100</distance></track>' http://localhost:3000/users/1/tracks

Уууууууу! Это очень круто. Я действительно впечатлен, что рельсы делают это. Просто чтобы посмотреть, что произойдет, я попробовал следующее:

curl -i -X POST -H 'Content-Type: application/xml -d '<track><distance>100</distance><points><point><lat>3</lat><lng>2</lng></point></points></track>' http://localhost:3000/users/1/tracks

Fail! Сервер плюет обратно:

Обработка TracksController # create (для 127.0.0.1 в 2010-04-14 00:03:25) [POST] Параметры: {"track" => {"points" => {"point" => {"lng" => "2", "lat" => "3"}}, "distance" => "100"} , "user_id" => "1"} Пользовательская нагрузка (0,6 мс) SELECT * FROM "users" WHERE ("users". "Id" = 1)

ActiveRecord :: AssociationTypeMismatch (ожидается точка (# - 620976268), получен массив (# - 607740138)): app / controllers / track_controller.rb: 47: в `create '

Кажется, мой track_controller не любит или не понимает, что он получает от объекта params в моем track_controller.rb:

def create
    @track = @user.tracks.build(params[:track])

Мой xml может быть неправильным, но, по крайней мере, Rails, похоже, ожидает от него Point. Могу ли я в любом случае исправить TracksController.create, чтобы он мог анализировать xml дорожки с несколькими вложенными точками? Или есть другой способ, которым я должен делать это полностью?

1 Ответ

2 голосов
/ 14 апреля 2010

Track.points= - магический метод, который ожидает любое количество Point объектов. Он добавляет и удаляет объекты из коллекции. Вы получаете это поведение, когда определяете ассоциацию has_many. Вот почему вы видите ActiveRecord::AssociationTypeMismatch.

Что вы действительно хотите сделать, так это принять вложенные атрибуты для связанной коллекции.

class Track < ActiveRecord::Base
  has_many :points

  accepts_nested_attributes_for :points
end

Отправка accepts_nested_attributes_for предоставит вам магический метод Track.points_attributes. Он ожидает массив хэшей, где каждый хеш является атрибутами для построения вложенного объекта.

curl -i -X POST -H 'Content-Type: application/xml' -d '<track><distance>100</distance><points_attributes><lat>3</lat><lng>2</lng></points_attributes></track>' http://localhost:3000/users/1/tracks

Журнал Rails может выглядеть примерно так:

Processing TracksController#create
  Parameters: {"track"=>{"distance"=>"100"}{"points_attributes"=>[{"lat"=>"3","lng"=>"2"}]}}

ActiveRecord :: NestedAttributes :: ClassMethods Документация по API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...