首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的Rails路由行为

奇怪的Rails路由行为
EN

Stack Overflow用户
提问于 2013-10-12 01:13:05
回答 3查看 68关注 0票数 1

Rails Guide on routing for nested resources之后,我有两个模型,我的路线如下:

代码语言:javascript
复制
# 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时,我得到以下信息,这似乎是不正确的。我的一些操作并不像我期望的那样嵌套:

代码语言:javascript
复制
   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操作已正确嵌套,但其他操作未正确嵌套。有人能解释为什么会发生这种情况吗?

EN

回答 3

Stack Overflow用户

发布于 2013-10-12 01:20:41

是不是因为你的"Captions“类是复数?如果你不遵守惯例,你会遇到一些痛苦。您的标题类文件名应为caption.rb,如下所示:

代码语言:javascript
复制
class Caption < ActiveRecord::Base
  belongs_to :media
end
票数 2
EN

Stack Overflow用户

发布于 2013-10-12 01:29:15

我相信这是因为"media“的复数是"media”。您可以在rails控制台中进行检查:

代码语言:javascript
复制
2.0.0-p0 :001 > include ActionView::Helpers::TextHelper
2.0.0-p0 :002 > pluralize(2, "media")
 => "2 media" 

所以Rails认为它是一种独特的资源。

票数 0
EN

Stack Overflow用户

发布于 2013-10-12 01:33:47

我认为路由是以这种方式构建的,以明确说明字幕正在被编辑,而不管它属于哪个媒体。

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

代码语言:javascript
复制
/medias/1/captions/10/edit
/medias/5/captions/10/edit

你仍然只能编辑标题10,这样路由就变得多余了。我们可以简单地把它写成

代码语言:javascript
复制
/captions/10/edit

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

代码语言:javascript
复制
/medias/1/captions

或者对于像newcreate这样的动作,我们说的是“为这个媒体做一个标题”。同样,我们需要一条特定的路由。

代码语言:javascript
复制
/medias/1/captions/new

从目前的情况来看,你可能会遇到相当多的多元化问题。我会考虑要么调整你的路线以适应惯例,要么设计一个新的命名标准。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19323717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档