Rails中的嵌套RESTful路由:我应该如何组织我的视图?

时间:2010-02-09 17:53:31

标签: ruby-on-rails rest

假设您有一个Invoice资源,并且每个Invoice都有嵌套的InvoiceLine资源,即一种非常常见的嵌套资源模式。

现在,应该将每个单独发票行的视图放在发票中的哪一行?发票行应该在invoices/_line.html.erb下呈现为部分,还是应该在invoices_lines/show.html.erb下获得自己的完整视图?通常前者是显而易见的选择,但是当您添加AJAX功能(用于在发票显示视图​​中添加和编辑行)时,事情变得复杂。

我发现自己经常在这方面苦苦挣扎,而且我不确定正确的方法来处理它。

这就是我的想法:

RESTful路线可能看起来像这样:

map.resoures :invoices do |invoice|
  invoice.resources :lines, :controller => :invoice_lines
end

视图的标准文件夹结构是:

app/
  views/
    invoices/
    invoice_lines/

现在,在使用其所有行渲染整个发票时,我倾向于将每一行变为_line.html.erb部分invoices/下的部分。但是当我想添加一些用于添加和编辑行的AJAX功能时,PUT和POST被路由到发票行控制器,所以不应该通过{{1下的标准show.html.erb视图呈现行行。 }}?

我的观点应该是这样的:

invoice_lines.erb

或者像这样:

app/
  views/
    invoices/
      index.html.erb
      show.html.erb
      _line.html.erb
    invoice_lines/

我遇到InvoiceLinesController使用app/ views/ invoices/ index.html.erb show.html.erb invoice_lines/ index.html.erb show.html.erb 中的部分来呈现对AJAX请求的响应,或者我可以将行行模板代码放在invoices/_line.html.erb中,并且invoice_lines/show.html.erb将各行作为组件或AJAX请求呈现给InvoiceLinesController #index。

两种选择都不对。有关最佳做法的任何建议吗?

感觉发票行控制器在发票上下文中呈现时应该拥有自己的一组视图,但Rails实际上没有明确规定“上下文”视图。

1 个答案:

答案 0 :(得分:2)

如何将部分_line.html.erb放入invoice_lines文件夹,然后在invoices_lines / show.html.erb模板发票/ show.html.erb中使用此部分。

这就是我在类似情况下的表现。

  • 这样,所有特定于发票的视图代码都在发票文件夹中,所有invoice_line代码都在invoice_line文件夹中。
  • 您是干的:您可以使用对invoice_line控制器的Ajax调用,或通过显示invoice / show.html.erb来呈现整个内容。 invoice_items将通过invoice_lines / _line.html.erb
  • 中的相同部分呈现两次

我希望这是有道理的,并且可以回答你的问题。我对Rails还不太熟悉,所以我不知道这是不是“最佳实践”