Создание нескольких ресурсов в одном RESTful POST в рельсах - PullRequest
11 голосов
/ 15 января 2011

Я создаю API в рельсах, чтобы показать приложение для iPhone, над которым я работаю. Я понимаю, что обычно вы создаете только один ресурс при публикации в действии create контроллера в Rails. Тем не менее, я не уверен, что лучший способ создать много ресурсов одновременно. Допустимо ли публиковать JSON / XML, содержащий несколько ресурсов одного и того же типа, в одном POST?

Например, создать сообщение, а затем добавить много получателей. Существует модель для самого сообщения, а затем модель для получателей, принадлежащих этому сообщению. Я создаю сообщение, публикуя в / messages, но что, если у меня будет 50 получателей, чтобы добавить к этому сообщению? Создание 50 отдельных POST для / messages / 1 / получателей кажется чрезмерным и расточительным. Как лучше всего это сделать?

Я новичок в Rails и приложениях RESTful в целом и очень ценю любую помощь.

Ответы [ 2 ]

4 голосов
/ 15 января 2011

Вы можете использовать accepts_nested_attributes_for для этого.В вашей родительской модели - где вы определяете свою has_many ассоциацию - вы бы добавили accepts_nested_attributes_for, присвоив ей то же имя ассоциации.Примерно так:

class Message < ActiveRecord::Base
  has_many :recipients
  accepts_nested_attributes_for :recipients
end

class Recipient < ActiveRecord::Base
  belongs_to :message
end

Тогда в форме вашего сообщения у вас будет куча полей для получателей с именами типа message[recipients_attributes][][name] и message[recipients_attributes][][email].Или вы можете использовать form_for и fields_for (вам просто нужно помнить, чтобы создать хотя бы один экземпляр в вашей коллекции has_many при переходе на страницу new).

Для большего (и лучшего)примеры, смотреть этот Railscast .

0 голосов
/ 18 февраля 2011

Если вы публикуете данные XML, вам также необходимо включить тип = "массив".Вот пример:

<message>
  <recipients_attributes type="array">
     <recipient>
       <name>Some Name</name>
       <email>example@example.com</email>
     </recipient>
     <recipient>
       <name>Some Name 2</name>
       <email>example2@example.com</email>
     </recipient>
  <recipients_attributes>
</message>

Если вы этого не сделаете, вы получите такие ошибки, как «неопределенный метод` stringify_keys 'для массива »и« невозможно преобразовать строку в целое число »в зависимости от вашей версии Rails,Они происходят из active_record / nested_attributes.rb.

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