在Rails中创建嵌套资源的最佳实践

时间:2011-12-07 06:05:38

标签: ruby-on-rails model-view-controller

我有一个向导,负责创建3种不同类型的资源。当用户完成向导时,用户点击提交并发送ajax POST以创建3个新条目。这3个资源都属于User。我想知道是否应该向包含所有3个资源的详细信息的用户控制器发送1个ajax请求,或者我是否应该将POST 3个ajax请求分别发送到每个资源的控制器。这样做的正确方法是什么?谢谢!

1 个答案:

答案 0 :(得分:3)

首先,进行一次小修正:您无法向资源模型发布请求。我相信你所说的是张贴到模特各自的控制器(我认为存在)。

如果你有一个单独的表单,那么你理解它,它会发布一次。为什么不与之合作?但在我们开始之前,让我们来解决另一种选择。

你的建议是,从3个ajax请求开始,会带来比解决的更多问题。例如,如果其中一个请求出错,该怎么办?如果你想遵循原子性原则,你如何取消其他两个。可能还有其他原因导致这样的设计考虑因素很糟糕,但我认为这很麻烦。让我们继续讨论如何处理这个问题。

负责向导表单的控制器应提供更多逻辑来处理3个额外资源。如果资源类型相似,您可能正在使用单表继承或某些东西来简化某些控制器代码,但这并不是那么相关。我们假设资源完全不相似。

简而言之,您可以将表单构建为多模型表单。如果用户可以为每种类型的资源创建多个条目,那么您将拥有一个创建多个子模型的表单。

如果您只需要每个资源中的一个,那么答案非常简单,只需对用户模型中的每种资源类型使用accepts_nested_attributes_for方法,并在视图中使用fields_for方法。 / p>

如果您需要每个资源的多个,那么您可能希望了解有关multiple children models in a form的更多信息。