Создание нескольких ресурсов в одном RESTful POST в рельсах

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

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

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

Ответы

Ответ 1

Вы можете использовать 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.

Ответ 2

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

<message>
  <recipients_attributes type="array">
     <recipient>
       <name>Some Name</name>
       <email>[email protected]</email>
     </recipient>
     <recipient>
       <name>Some Name 2</name>
       <email>[email protected]</email>
     </recipient>
  <recipients_attributes>
</message>

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