在Rails Guide on routing for nested resources之后,我有两个模型和我的路线如下:
# 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
如您所见,index
和create
操作已正确嵌套,但其他操作则没有。任何人都可以解释为什么会这样吗?
答案 0 :(得分:2)
是因为你的“Captions”类是复数吗?如果你不遵守惯例,你会有些痛苦。您的字幕类文件名应为caption.rb
,如下所示:
class Caption < ActiveRecord::Base
belongs_to :media
end
答案 1 :(得分:0)
我认为这是因为复数“媒体”是“媒体”。您可以在rails控制台中检查:
2.0.0-p0 :001 > include ActionView::Helpers::TextHelper
2.0.0-p0 :002 > pluralize(2, "media")
=> "2 media"
所以Rails认为这是一种独特的资源。
答案 2 :(得分:0)
我认为路由是以这种方式构建的,以明确表示正在编辑标题,无论它属于哪个媒体。
考虑has_and_belongs_to_many
关系,其中标题可能属于多个媒体。如果您有以下路线:
/medias/1/captions/10/edit
/medias/5/captions/10/edit
您仍然只会编辑标题10.然后路线变得多余。我们可以简单地将其写为
/captions/10/edit
但是,使用嵌套在成员路线下的index
操作意味着“向我显示此媒体的字幕”,因此需要明确说明:
/medias/1/captions
对于new
或create
等行为,我们会说“为此媒体制作标题”。我们需要一条特定的路线。
/medias/1/captions/new
从事物的外观来看,你可能会遇到很多复数问题。我会考虑调整你的路线以适应惯例,或者设计一个新的命名标准。