2011-01-15 9 views
11

私が取り組んでいるiPhoneアプリケーションに公開するためのAPIをレールに作成しています。私は通常、Railsのコントローラの作成アクションに投稿するときには、単一のリソースしか作成しないことを理解しています。しかし、一度に多くのリソースを作成する最善の方法はわかりません。単一のPOSTに同じタイプの複数のリソースを含むJSON/XMLを投稿することは可能ですか?1つのRESTful POSTで複数のリソースをレールに作成する

たとえば、メッセージを作成してから、多くの受信者を追加します。メッセージ自体のモデルがあり、メッセージに属する受信者のモデルがあります。/messagesに投稿することでメッセージを作成しますが、そのメッセージに追加する受信者が50人いるとどうなりますか?/messages/1/recipientsへの50の別々のPOSTを行うことは、過度で無駄に思われます。これについて最善の方法は何ですか?

私はRailsとRESTfulなアプリケーションに一般的になっていて、何か助けてくれてありがとうございます。

答えて

4

これにはaccepts_nested_attributes_forを使用できます。親モデルでは、has_manyアソシエーションを定義する場所に、同じアソシエーション名を与えるを追加します。多くのこのような:

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_forfields_forを使用することもできます(newページに行くときは、has_manyコレクションに少なくとも1つのインスタンスを構築することを忘れないでください)。

さらに多くの(そしてより良い)例については、watch this Railscastです。

+1

クール、まさに私が探していたものです。ありがとう! これはJSONの例を持っています: http://www.rogue-development.com/blog2/2009/05/creating-nested-objects-with-json-in-rails/ –

0

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> 

そうでない場合は、「アレイのための未定義のメソッド `stringify_keys'」のようなエラーが出るだろうとRailsのバージョンに応じて、『文字列を整数に変換できません』。これらはactive_record/nested_attributes.rbに由来します。

関連する問題