2012-01-23 16 views
1

我有一個rails應用程序,它擁有一個Products的列表,因此我的ProductsController上有一個index操作,允許我查看它們的全部列表。請求所有記錄的備用視圖的Rails方式是什麼?

我想有另一種產品的視圖,向他們展示更多的信息和不同的格式 - Rails的方式是什麼?

我圖我的主要選項有:

  1. 傳遞參數(products/index.html?other_view=true),然後在一個ProductsController#indexif else呈現所要求的不同視圖。這感覺有點混亂。

  2. 傳遞參數(products/index.html?other_view=true),然後在我的視圖(index.html.haml)中有一個if else塊,該塊根據需要呈現不同的html。 (我已經知道這是不是正確的選擇。)

  3. 實現具有它自己的視圖(detailed_index.html.haml)我控制器上創建新的動作(例如:ProductsController#detailed_index)。這不再是RESTful嗎?

是那些更好的選擇之一,還是有另一種選擇,我沒有考慮?

謝謝!

回答

2

這樣做的另一種方法是通過自定義格式。這通常是爲了提供移動特定版本的頁面,但我不明白爲什麼這裏不能應用相同的想法。

註冊:詳細作爲文本/ html的別名,然後有index.detailed.haml(或.erb)與額外的信息。如果您需要爲詳細視圖加載額外數據,您可以在respond_to區塊內完成。

然後訪問者/somecollection/index.detailed應該會看到詳細視圖。你可以鏈接到它some_collection_path(:format=>'detailed')

我不確定這是否'bettrr'比替代品,但有一定的邏輯,我認爲說詳細視圖只是數據的替代表示,這是什麼格式用於。

+0

不錯的一個 - 我沒有想到這一點。如果我有多個需要詳細視圖的模型,這會很有意義,但在此應用程序中,我只需要它用於產品。但我喜歡你的想法! –

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,它會生成URL /products/detailed

執行此操作後,我確信這是正確的路要走。正如RoR指南所說,如果我正在做很多自定義操作,那可能意味着我應該有另一個控制器,但是像這樣的一個額外操作很容易實現,是DRY並且運行良好。感覺像Rails Way。 :-)

相關問題