Создание нескольких ресурсов в одном 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.