Ruby on Rails命名空间和嵌套路由

时间:2013-10-03 01:54:52

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

我正在学习Ruby和Rails,并试图找出最适合我的方案的路径,可能是命名空间和路由。

假设我有一个'Zoo'模型以及'Species'模型。我还需要他们之间的关系,以告诉物种在什么动物园(动物园有很多物种,它们也有自己的属性,如数量,位置等)

我希望我的路线像:

/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控制器。我觉得我越来越接近理想的结果了,但是我认为我应该对抗框架。仍然遇到一些问题,正确设置关系和路径,必须指定很多配置值

2 个答案:

答案 0 :(得分:0)

尝试使用浅嵌套:

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

在你的情况下:

resources :zoos
  resources :species, shallow :true

答案 1 :(得分:0)

嵌套资源:

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