1

按照关于嵌套资源路由的 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

如您所见,indexandcreate动作是正确嵌套的,但其他动作不是。谁能解释为什么会这样?

4

3 回答 3

2

是因为您的“字幕”类是复数吗?如果你不遵守约定,你会很痛苦。您的字幕类文件名应caption.rb如下所示:

class Caption < ActiveRecord::Base
  belongs_to :media
end
于 2013-10-11T17:20:40.947 回答
0

我认为以这种方式构建路由是为了明确说明正在编辑标题,无论它属于哪个媒体。

考虑一种has_and_belongs_to_many关系,其中标题可能属于多种媒体。如果您有以下路线:

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

您仍然只需要编辑 Caption 10。然后这些路线就变得多余了。我们可以简单地写成

/captions/10/edit

但是,使用index嵌套在成员路由下的操作意味着“显示媒体的标题”,因此需要明确说明:

/medias/1/captions

或者对于诸如new或之类的操作create,我们说的是“为此媒体制作标题”。同样,我们需要一个特定的路线。

/medias/1/captions/new

从事情的外观来看,你可能会遇到很多多元化的问题。我会考虑调整你的路线以适应惯例,或者设计一个新的命名标准。

于 2013-10-11T17:33:46.807 回答
0

我相信这源于“媒体”的复数形式是“媒体”。您可以在 rails 控制台中检查:

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

所以 Rails 认为它​​是一种单一的资源。

于 2013-10-11T17:29:15.473 回答