奇怪的Rails路由行为

时间:2013-10-11 17:13:05

标签: ruby-on-rails ruby

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

如您所见,indexcreate操作已正确嵌套,但其他操作则没有。任何人都可以解释为什么会这样吗?

3 个答案:

答案 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

对于newcreate等行为,我们会说“为此媒体制作标题”。我们需要一条特定的路线。

/medias/1/captions/new

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