什么是Rails方式请求所有记录的备用视图?

时间:2012-01-23 12:48:36

标签: coding-style ruby-on-rails-3.1

我有一个有Products列表的rails应用,因此我的index上有一个ProductsController操作,允许我查看所有这些操作的列表。

我希望有另一种产品视图,它们以更多信息和不同格式呈现它们 - 这样做的Rails方式是什么?

我认为我的主要选择是:

  1. 传递一个参数(products/index.html?other_view=true),然后在if else中有一个ProductsController#index块,根据需要呈现不同的视图。感觉有点乱。

  2. 传递一个参数(products/index.html?other_view=true),然后在我的视图中有一个if else块(index.html.haml),根据需要呈现不同的html。 (我已经知道这不是正确的选择。)

  3. 在我的控制器(例如:ProductsController#detailed_index)上实施一个具有自己视图的新操作(detailed_index.html.haml)。这不再是RESTful吗?

  4. 其中一个是优先选择,还是有其他选择我还没有考虑过?

    谢谢!

2 个答案:

答案 0 :(得分:2)

另一种方法是通过自定义格式。这通常是为了提供移动特定版本的页面,但我不明白为什么这里不能应用相同的想法。

注册:详细说明text / html的别名,然后使用index.detailed.haml(或.erb)获取额外信息。如果需要为详细视图加载额外数据,可以在respond_to块中加载。

然后/somecollection/index.detailed的访问者应该看到详细视图。您可以使用some_collection_path(:format=>'detailed')

链接到该链接

我不确定这是否比其他选择更好,但我认为有一定的逻辑说明详细视图只是数据的替代表示,这就是格式的用途。

答案 1 :(得分:0)

在做了一些阅读之后,我认为添加一个新的RESTful动作(我的问题中的选项#3)是要走的路。详细信息如下:http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

我已经更新了我的routes.rb:

resources :products do
  get 'detailed', :on => :collection
end

并为我的ProductsController添加了相应的操作:

def detailed
    # full_details is a scope that eager-loads all the associations
    respond_with Product.full_details
end

然后当然添加了detailed.html.haml视图,以我想要的详细方式显示产品。我可以使用生成网址detailed_products_path的{​​{1}}链接到此内容。

执行此操作后,我确信这是正确的方法。正如RoR指南所说,如果我做了很多自定义动作,这可能意味着我应该有另一个控制器,但是这样一个额外的动作很容易实现,DRY并且效果很好。感觉就像The Rails Way。 : - )