在rails中的单个RESTful POST中创建多个资源

我正在使用rails创建一个API来暴露给我正在处理的iPhone应用程序。 据我所知,通常只有在发布到Rails中控制器的create动作时才创建单个资源。 但是,我不确定一次创建多个资源的最佳方法。 在单个POST中发布包含多个资源的JSON / XML是否可以在同一类型中创建?

例如,创建邮件然后添加许多收件人。 消息本身有一个模型,然后是属于该消息的收件人的模型。 我通过发布到/消息来创建消息,但如果我有50个收件人要添加到该消息,该怎么办? 对/ messages / 1 /收件人进行50次单独的POST似乎过度且浪费。 最好的方法是什么?

我是Rails和RESTful应用程序的新手,非常感谢任何帮助。

您可以使用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_forfields_for (您只需要记住在转到new页面时在has_many集合中至少构建一个实例)。

有关更多(和更好)的示例,请观看此Railscast 。

如果要发布XML数据,还需要包含type =“array”。 这是一个例子:

    Some Name example@example.com   Some Name 2 example2@example.com    

如果你不这样做,你会得到像“未定义的方法`stringify_keys’对于Array”和“无法将String转换为整数”这样的错误,具体取决于你的Rails版本。 这些源自active_record / nested_attributes.rb。