我正在使用rails创建一个API,以显示我正在处理的iPhone应用。据我所知,通常在发布到Rails中控制器的create动作时只创建一个资源。但是,我不确定一次创建多个资源的最佳方法。在单个POST中发布包含多个资源的JSON / XML是否可以在同一类型中创建?
例如,创建邮件然后添加许多收件人。消息本身有一个模型,然后是属于该消息的收件人的模型。我通过发布到/消息创建消息,但如果我有50个收件人添加到该消息,该怎么办?对/ messages / 1 /收件人进行50次单独的POST似乎过度且浪费。最好的方法是什么?
我是Rails和RESTful应用程序的新手,非常感谢任何帮助。
答案 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_for
和fields_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。