2013-10-11 91 views
1

Rails Guide on routing for nested resources,我有兩個模型和我的路線,像這樣:奇怪的Rails路由行爲

# media.rb 
class Media < ActiveRecord::Base 
    has_many :captions, class_name: "Captions", dependent: :destroy 
end 

# captions.rb 
class Captions < ActiveRecord::Base 
    belongs_to :media 
end 

# routes.rb 
resources :medias do 
    resources :captions 
end 

當我運行rake routes | grep captions我得到以下,這似乎不正確。我的某些行爲不嵌套我希望他們的方式:

media_captions GET  /medias/:media_id/captions(.:format)  captions#index 
        POST /medias/:media_id/captions(.:format)  captions#create 
new_media_caption GET  /medias/:media_id/captions/new(.:format) captions#new 
    edit_captions GET  /captions/:id/edit(.:format)    captions#edit 
     captions GET  /captions/:id(.:format)     captions#show 
        PUT  /captions/:id(.:format)     captions#update 
        DELETE /captions/:id(.:format)     captions#destroy 

正如你所看到的,indexcreate動作正確嵌套,但其他動作都沒有。任何人都可以解釋爲什麼會發生?

回答

2

是否因爲您的「字幕」類是複數?如果你不遵守約定,你會感到痛苦。您的標題類文件名應爲caption.rb,看起來像這樣:

class Caption < ActiveRecord::Base 
    belongs_to :media 
end 
+0

我重命名它,它不會改變任何東西。 – jamesfzhang

+0

沒錯!但我不認爲這就是造成奇怪路由器的原因。無論您是否在控制器中執行操作,Rails都會生成路由。 – Daiku

+0

是的,控制器操作存在。事實上,媒體過去只有一套標題,但現在我正在改變模型,以便能夠有多個標題。所以我認爲從「資源」到「資源」的簡單改變將創建正確的路線。 – jamesfzhang

0

我相信一個事實,即「媒介」的複數是「媒體」造成的。你可以在軌道控制檯檢查:

2.0.0-p0 :001 > include ActionView::Helpers::TextHelper 
2.0.0-p0 :002 > pluralize(2, "media") 
=> "2 media" 

因此,Rails認爲這是一個單一的資源。

+0

嗯,可能。但是,我試着將'資源:媒體'改爲'資源:媒體',它不會改變任何東西。 – jamesfzhang

+0

嘗試將它改爲簡單的東西,比如「鳥」,只是爲了測試理論。 – Daiku

0

我認爲路線是這樣構造的,以便明確標題正在被編輯,而不管它屬於哪個媒體。

考慮一個has_and_belongs_to_many關係,其中標題可能屬於多個媒體。如果您有以下路線:

/medias/1/captions/10/edit 
/medias/5/captions/10/edit 

您仍然只能編輯標題10.路線然後變得多餘。我們可以但是寫這個只是作爲

/captions/10/edit 

,使用index行動成員路徑下築巢的意思是「讓我爲這個媒體的標題」,所以,需要加以明確說明:

/medias/1/captions 

或者對於諸如newcreate之類的操作,我們說「爲此媒體制作標題」。我們再次需要一個特定的路線。

/medias/1/captions/new 

從外觀上看,你可能會遇到相當多的複雜問題。我會考慮調整你的路線以符合慣例,或者爲命名設計一個新的標準。

+0

這似乎對我有意義。然而,爲什麼當模型沒有'has_and_belongs_to_many'關係時,rails會強制執行此操作。Rails指南中的示例使用'Magazine'和'Ad',並且路由正確嵌套。我的模型唯一的區別是複數問題。 – jamesfzhang

+0

@ JZ11'資源'不知道任何關係。它只知道構建嵌套的路線。這就是爲什麼公約如此重要。並非Rails中的所有內容都知道其他所有內容,但如果遵循約定,它們將會融合在一起。 –