2011-04-05 41 views
0

我想有一個Rails 3 web應用程序的不同部位的部分。站點部分應使用相同的控制器和相同的視圖顯示相同的資源。動態URL生成用於網站的欄目

所以http://foo.org/premium/products/1應呈現與http://foo.org/products/1相同的產品(也許根據該部分進行一些修改)。

用於處理我想到莫名其妙地重寫URL(也許在routes.rb中,在機架級或服務器級),讓http://foo.org/premium/products/1變得http://foo.org/products/1?section=premium。有沒有更好的解決方案?

但真正的問題,我看到的是產生這些網站的應保留部分的鏈接時。例如。產品編號爲http://foo.org/premium/products/1的鏈接應爲http://foo.org/premium/products/2而不是http://foo.org/products/2?section=premium

可惜事實並非如此微不足道的link_to和* _path不知道的部分。我也希望使這種高度動態的,以便我可以輕鬆地添加和刪除部分,而不接觸靜態路線。

我想到了他們被link_to產生後重寫的URL。這會是一個好方法嗎?還有其他建議嗎?

回答

0

最後我選擇了重寫URL的方式,因爲只有輕微的變化b在那些網站部分(例如另一個背景)。這樣我可以重用所有的MVC類,而不是在使用路由名稱空間時創建新的東西。

重寫我用機架中間件的URL。所有傳入的URL都由rack-rewrite重寫。響應主體的鏈接是由其他自定義中間件(像在這個Railscasts transcript完成。

所以像/premium/products/1網址中就會出現如/products/1?section=premium(反之亦然)。

1

您可以使用一個命名空間(如@ jpx777說),你的項目結構應該是這樣的:

app/ 
+controllers/ 
++premium/ 
+++products_controller.rb 
++products_controller.rb 
+views/ 
++premium/ 
+++products/ 
++++...(premium product related views) 
++products/ 
+++...(product related views) 

而在你的routes.rb:

namespace "premium" do 
    resources :products 
end 
resources :products 
+0

好吧,看來我的問題是沒有被改寫(我更新它)。命名空間方法使用一個新的控制器和其他視圖。我想要的是重用相同的控制器和視圖,只是一個別名URL來訪問它(和一個選項,以獲取控制器內的別名)但我想'link_to'保持當前別名URL。 – Zardoz 2011-04-05 14:27:27

+0

我仍然認爲該命名空間是做到這一點的最好辦法。您是否擔心讓事情幹?如果是這樣的話,你可以在你的視圖使用的諧音,創造一個可以包含的模塊在每個控制器中。這樣你就可以爲佈局甚至控制器中可能發生的任何必要更改做好準備。否則,每次出現保費和非保費之間的差異時,您都會進行黑客入侵。 – 2011-04-05 14:42:20

+0

是的,這是我在這裏看到的一個乾燥問題。我必須爲每個網站部分使用視圖變體,因爲我也有不同的路徑(例如'premium_products_path','producsts_path')。如果我想重新使用partials或完整的視圖,那麼我將再次檢查我當前的哪個部分,然後用正確的路徑調用'link_to'。或者我錯過了什麼? – Zardoz 2011-04-05 15:18:32