在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操作已正确嵌套,但其他操作未正确嵌套。有人能解释为什么会发生这种情况吗?
发布于 2013-10-12 01:20:41
是不是因为你的"Captions“类是复数?如果你不遵守惯例,你会遇到一些痛苦。您的标题类文件名应为caption.rb,如下所示:
class Caption < ActiveRecord::Base
belongs_to :media
end发布于 2013-10-12 01:29:15
我相信这是因为"media“的复数是"media”。您可以在rails控制台中进行检查:
2.0.0-p0 :001 > include ActionView::Helpers::TextHelper
2.0.0-p0 :002 > pluralize(2, "media")
=> "2 media" 所以Rails认为它是一种独特的资源。
发布于 2013-10-12 01:33:47
我认为路由是以这种方式构建的,以明确说明字幕正在被编辑,而不管它属于哪个媒体。
考虑一个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从目前的情况来看,你可能会遇到相当多的多元化问题。我会考虑要么调整你的路线以适应惯例,要么设计一个新的命名标准。
https://stackoverflow.com/questions/19323717
复制相似问题