2011-01-15 14 views
11

Tworzę interfejs API w szynach, aby udostępnić aplikację iPhone, nad którą pracuję. Rozumiem, że zwykle tworzysz tylko jeden zasób podczas wysyłania do działania tworzenia kontrolera w Railsach. Jednak nie jestem pewien, jak najlepiej stworzyć wiele zasobów naraz. Czy dopuszczalne jest publikowanie JSON/XML zawierającego wiele zasobów tego samego typu w jednym POST?Tworzenie wielu zasobów w jednym RESTful POST w szynach

Na przykład tworzenie wiadomości, a następnie dodawanie wielu odbiorców. Istnieje model dla samej wiadomości, a następnie model dla odbiorców, którzy należą do wiadomości. Tworzę wiadomość, publikując w/wiadomościach, ale co jeśli mam 50 odbiorców do dodania do tej wiadomości? Dokonywanie 50 oddzielnych testów POST dla/messages/1/recipients wydaje się nadmierne i marnotrawstwo. Jaki jest najlepszy sposób na zrobienie tego?

Jestem nowy dla Railsów i aplikacji RESTful w ogóle i bardzo doceniam każdą pomoc.

Odpowiedz

4

Do tego można użyć accepts_nested_attributes_for. W modelu nadrzędnym - w miejscu zdefiniowania powiązania has_many - należy dodać accepts_nested_attributes_for, nadając mu tę samą nazwę skojarzenia. Podobnie jak to:

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

class Recipient < ActiveRecord::Base 
    belongs_to :message 
end 

Następnie w formularzu za wiadomość, to że mają kilka pól dla odbiorców nazwanych coś message[recipients_attributes][][name] i message[recipients_attributes][][email]. Lub możesz użyć form_for i fields_for (musisz tylko pamiętać, aby zbudować co najmniej jedną instancję z kolekcji has_many, gdy przejdziesz na stronę new).

Więcej (i lepszych) przykładów, watch this Railscast.

+1

Fajnie, dokładnie tego, czego szukałem. Dzięki! Też znalazł to, który miał przykład JSON: http://www.rogue-development.com/blog2/2009/05/creating-nested-objects-with-json-in-rails/ –

0

Jeśli publikujesz dane XML, musisz również wpisać type = "array". Oto przykład:

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

Jeśli nie, dostaniesz błędy typu „niezdefiniowanych metoda` stringify_keys' na tablicy”i«nie można przekonwertować ciąg na Integer»w zależności od wersji Rails. Pochodzą one z active_record/nested_attributes.rb.

Powiązane problemy