【问题标题】:Ruby on Rails Namespacing and Nested RoutingRuby on Rails 命名空间和嵌套路由
【发布时间】:2026-02-12 14:40:01
【问题描述】:

我正在学习 Ruby 和 Rails,并试图找出最正确的路径来解决可能的命名空间和路由问题。

假设我有一个“动物园”模型和“物种”模型。我还需要它们之间的关系来判断动物园中有哪些物种(动物园有很多物种,它们也有自己的属性,如数量、位置等)

我希望我的路线是这样的:

/zoo
/zoo/:id
...
/zoo/:zoo_id/species/
/zoo/:zoo_id/species/:id
...
/species
/species/:id

我尝试过处理模块、命名空间、路由范围等。我似乎无法理解我想要的方式,并认为必须有更好/自然的方式来做到这一点。问题主要是因为我有一个物种模型以及一个动物园的物种模型(我已经尝试对 Zoo 进行命名空间并创建 Zoo::Zoo 和 Zoo::Species 类,创建 ZooSpecies 类,以及为这些场景调整路线等)

从组织的角度来看,能够拥有 Zoo 类以及 Zoo 命名空间、拥有 Zoo::Species 等会很棒,但这是不可能的。

组织这样的事情的正确方法是什么?

更新:我目前的设置...

Zoo Module
Zoo::Zoo Class
Zoo::Species Class
Species Class

路线:

resources :zoos, path: 'zoos' do
  resources :zoo_species, path: 'species', as: 'species', controller: 'zoo/species'
end

还有一个Zoo 控制器和一个Zoo::Species 控制器。我觉得我越来越接近预期的结果,但与框架的斗争比我认为的要多。在正确设置关系和路径时仍然遇到一些问题,必须指定很多配置值

【问题讨论】:

  • 为什么要同时使用/zoo/:zoo_id/species/:id/species/:id
  • 动物园和物种之间的关系难道不是 M:M 吗?
  • @tybro0103 - 我想要两条路线,这样我就可以展示一般的物种(例如:这个页面是关于一般的斑马)和关于动物园里特定物种的信息(例如:这是现在这个动物园有很多斑马,它们在哪里,等等)。是的,通过协会是多对多的。我的问题主要是因为我通常有“物种”以及“动物园物种”,然后制定出友好的路线。所以我不确定基于这一事实的最佳组织方式......在 Zoo 下命名的 Species 会是最好的吗?或者一个 ZooSpecies 类然后修复路由?

标签: ruby-on-rails ruby routes ruby-on-rails-4 rails-routing


【解决方案1】:

尝试使用浅嵌套:

http://edgeguides.rubyonrails.org/routing.html#nested-resources

在你的情况下:

resources :zoos
  resources :species, shallow :true

【讨论】:

    【解决方案2】:

    嵌套资源:

    resources :zoos do # /zoos(/:id)
      resources :species # /zoos/:zoo_id/species(/:species_id)
    end
    

    到命名空间:

    namespace :zoo do
      resources :posts # /zoo/posts(/:id)
    end
    

    如果您创建该命名空间,您需要创建 app/controllers/zoo/posts_controller.rb 并定义类:

    class Zoo::PostsController < ApplicationController
      # ...
    end
    

    注意:嵌套资源和命名空间是两个不同的东西。 Rails 路由指南非常易读——你绝对应该这样做:http://guides.rubyonrails.org/routing.html

    【讨论】:

    • 旁注:"species".singularize == "species".pluralize evals to true...Rails 很酷 ;)
    • 第一个嵌套资源示例的问题是我有一个模式物种,以及我的关系,我最初称之为 ZooSpecies,现在是 Zoo::Species。我将用我现在如何设置的更新详细信息来更新我的问题
    • 奇怪的是,我的路线中有一次确实有“specy”。我已经把它搞砸了,它现在已经消失了,不知道我是怎么到那里的。我也确实将它添加为反射,否则它会生成特定的模型......奇怪。
    • 您可能想查看has_many 上的through 选项