0

我有三个模型:Page、Section 和 Block。一个Page 有很多Section,一个Section 有很多Block。我正在尝试以这样一种方式编写它,其中页面视图具有用于创建新部分的表单,而部分视图具有用于创建块的表单。

我的问题是将page_idPage 视图传递给 section#create 方法;我不确定它是如何完成的。为了成为 RESTful,我是否必须在 URL 中包含父关联(即怪物 URL,如www.mydomain.com/pages/1/sections/3/blocks/5),以便我可以获取新查询的 id,然后执行类似的操作?

def create
  @page = Page.find(params[:page_id])
  @section = @page.sections.build(section_params)

我一直在阅读这篇文章(http://ruby.railstutorial.org/),它接近于解释像我这样的用例,但我被卡住了。我确信有一种构建 CRUD 路由的“Rails 方式”,其中每个资源都嵌套在下一个资源中;谁能启发我?

4

1 回答 1

0

看看 Jose Valim 的inherit_resources。它可以很好地处理 RESTful 资源,并且支持嵌套。

但是,如果您的资源是唯一可寻址的,则不必严格嵌套它们。常见的建议是嵌套深度不要超过一层。这就是:shallow路由的来源,它能够在 routes.rb 中表达嵌套关系,而无需创建巨大的 URL 和命名路由。浅层路由还有助于提高灵活性,允许资源在层次结构中移动/移入/移出,而无需更新代码。

我将如何构建视图和控制器以仅显示属于特定页面的部分...?

好吧,由于这个特定示例只有一层深度,它仍然属于单层嵌套的建议范围内:/pages/1/sections. 但是对于更深层次的嵌套(或者如果你把所有东西都保持在顶层),你会使用查询字符串:例如/sections?page_id=1or /sections/blocks?page_id=1.

...并将页面的 id 传递给 section#create 方法而不嵌套?

这个比较直接。将其放入表单本身(可能作为隐藏输入)。

于 2013-11-04T16:22:19.747 回答