2011-01-15 13 views
11

Estoy creando una API en rieles para exponer a una aplicación de iPhone en la que estoy trabajando. Entiendo que generalmente solo creas un único recurso cuando publicas en la acción de crear un controlador en Rails. Sin embargo, no estoy seguro de la mejor manera de crear muchos recursos a la vez. ¿Es aceptable publicar JSON/XML que contiene múltiples recursos para crearse del mismo tipo en un único POST?Creando múltiples recursos en una sola POST RESTful en rieles

Por ejemplo, crear un mensaje y luego agregar muchos destinatarios. Hay un modelo para el mensaje en sí, y luego un modelo para los destinatarios que pertenece al mensaje. Creo el mensaje publicando en/messages, pero ¿qué sucede si tengo 50 destinatarios para agregar a ese mensaje? Hacer 50 POSTs por separado a/messages/1/recipients parece excesivo y derrochador. ¿Cuál es la mejor manera de hacerlo?

Soy nuevo en Rails y aplicaciones RESTful en general y agradezco mucho cualquier ayuda.

Respuesta

4

Puede usar accepts_nested_attributes_for para esto. En su modelo principal, donde define su asociación has_many, debe agregar el accepts_nested_attributes_for dándole el mismo nombre de asociación. Al igual que esta:

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

class Recipient < ActiveRecord::Base 
    belongs_to :message 
end 

Luego, en forma de su mensaje, tendríamos un montón de campos para los destinatarios con un nombre como message[recipients_attributes][][name] y message[recipients_attributes][][email]. O puede usar form_for y fields_for (solo debe recordar crear al menos una instancia en su colección has_many cuando vaya a la página new).

Para obtener más (y mejores) ejemplos, watch this Railscast.

+1

Genial, exactamente lo que estaba buscando. ¡Gracias! También encontré esto que tenía un ejemplo de JSON: http://www.rogue-development.com/blog2/2009/05/creating-nested-objects-with-json-in-rails/ –

0

Si está publicando datos XML, también debe incluir type = "array". He aquí un ejemplo:

<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> 

Si no, obtendrá errores como "método no definido` stringify_keys' para la matriz" y 'no se puede convertir la serie en Entero', dependiendo de su versión de los carriles. Estos se originan de active_record/nested_attributes.rb.

Cuestiones relacionadas