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

时间:2011-01-15 06:02:56

标签: ruby-on-rails rest post resources

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

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

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

2 个答案:

答案 0 :(得分:4)

您可以使用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集合中至少构建一个实例。)

有关更多(和更好)的示例watch this Railscast

答案 1 :(得分:0)

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

<message>
  <recipients_attributes type="array">
     <recipient>
       <name>Some Name</name>
       <email>example@example.com</email>
     </recipient>
     <recipient>
       <name>Some Name 2</name>
       <email>example2@example.com</email>
     </recipient>
  <recipients_attributes>
</message>

如果不这样做,您将收到类似“未定义的方法`stringify_keys'for Array”和“无法将String转换为Integer”的错误,具体取决于您的Rails版本。这些来自active_record / nested_attributes.rb。