Rails Way(4.0)用关系创建多级CRUD?

时间:2013-11-03 23:33:27

标签: ruby-on-rails ruby crud database-relations

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

我的问题是将page_id从Page视图传递到#create方法部分;我不确定它是如何完成的。为了成为RESTful,我是否必须在URL中包含父关联(即像www.mydomain.com/pages/1/sections/3/blocks/5这样的怪物URL),这样我就可以获得新查询的id,然后做这样的事情?

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

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

1 个答案:

答案 0 :(得分:0)

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

但是,如果您的资源是唯一可寻址的,那么您并不严格需要来嵌套它们。 common建议recommends,您不会深入嵌套多个级别。这是:shallow路由的来源,能够在routes.rb中表达嵌套关系,而无需创建巨型URL和命名路由。浅路径还有助于提高灵活性,允许资源在层次结构中移动/进出/移出,而无需更新代码。

  

如何构建视图和控制器以仅显示属于特定页面的章节??

因为这个特定的例子只有一个深度,它仍然属于单层嵌套的建议:/pages/1/sections。但是对于更深层次的嵌套(或者如果你把所有东西保持在最高级别),你将使用查询字符串:例如/sections?page_id=1/sections/blocks?page_id=1

  

...并将Page的id传递给#build方法而没有嵌套?

这个更直接。把它放在表单中(可能是一个隐藏的输入)。