2014-09-21 58 views
0

我有一個TextsController,每個Text可以是不同的(固定)類型。使用動態前綴代替控制器名稱的Rails資源路由

比方說,我有一個「書」類型。我想創建一個資源路徑來顯示文本,我希望路由是這樣的:

/book/my-book

另一種類型,「手冊」來說,應該導致使用以下網址:

/manual/rtfm

嗯,我haveRTFM,我不能讓它工作,我認爲它應該工作的方式。

這是我已經試過:

scope '/:text_type' do 
    resources :texts, only: :show 
end 

rake routes顯示我下面的路線規格:

text GET /:text_type/texts/:id(.:format) texts#show

我不知道爲什麼靜態「文本」段應該有?

所以,我想包括空path選項:

scope '/:text_type', path: '' do 
    resources :texts, only: :show 
end 

不會改變什麼,我猜是因爲(from source)我的第一個參數scope實際上覆蓋給予path任何價值。
的唯一途徑設置這讓我什麼我要找的是這樣的:

scope '/:text_type' do 
    resources :texts, only: :show, path: '' 
end 

這似乎完全打敗scope其目的是爲了「[適用範圍]一組路線爲給定的默認選項」。

爲何我的resources調用爲什麼以前的任何形式實際上都不會覆蓋path

對我來說看起來像一個bug?

所以我應該提交一個錯誤報告,或者你會用f *手冊讓我頭疼嗎? ^^

回答

1

首先是範圍的東西。具有作用域的路由適用於命名空間路由,就像您對管理區域所做的一樣。所以提到的路由生成正確,並且沒有錯誤(並且不需要錯誤報告)。您可以在Controller Namespaces and Routing閱讀關於命名空間的更多詳細信息。
您可以通過遵循'Creating Vanity URLs in Rails' 或使用friendly_id寶石像Railscast建議您自己塞住參數。
雖然我會堅持ID,只要我可以有幾個原因。

+0

那麼,文本類型的路徑前綴實際上純粹是SEO的語義,在內部文本類型之間沒有實現差異。 根據文檔*和*您提供的鏈接,作用域是將默認屬性應用於一組路徑的一種方式。他們在名稱空間示例中使用它,實際上,它將解決'namespace'的影響,該命名將導向嵌套在模塊中的控制器。 我可以在沒有範圍的情況下實現我想要的功能,但是我必須在每條路徑上重複我的路徑選項,重複範圍應該在這裏避免... – 2014-09-21 20:11:47

+0

O.K.我以不同的方式提出這個問題:你期望像/ book/my-book或/ manual/rtfm這樣的路徑能夠返回嗎(我認爲它們是GET路線)? – 2014-09-22 07:23:28

+0

嗯,我想顯示由「我的書」或「rtfm」slug/id標識的文本。 – 2014-09-22 16:16:18