Rails:资源可以从两条路线到达,还是更好的方法?

我正在开发一个用户可以分享照片的应用。 照片可以选择属于集合,但不必。

目前,用户可以通过以下方式查看所有照片: photos/id 。 我认为如果他们可以通过collections/id/photos浏览特定馆藏的照片也是有意义的

因此,这意味着照片既是顶级资源又是嵌套资源。 我想我可以在这样的路线中设置它:

 resources :photos resources :collections do resources :photos end 

这是一个好主意,还是有更好的方法来重用照片模型,同时还允许它在适当时作为嵌套在集合中? 我非常感谢关于处理这种情况的“轨道方式”的建议。

谢谢!

你建议的路线非常好。 但是,您需要注意您的照片控制器操作。 因为可以为单个照片或集合调用它们,所以您需要根据可用的参数有条件地查找照片。

另外,我建议更具体地说明每条路线可以采取哪些措施:

 resources :photos resources :collections do resources :photos, :only => [:index, :create, :destroy] end # index => show photos in a collection # create => add a photo to a collection # destroy => remove a photo from a collection 

您实际上不需要根据您提供的信息编辑/更新/显示照片作为集合的成员。

另一种选择是使用命名空间路由:

 namespace :collection, :path => '/collection', :as => :collection do resources :photos, :only => [:index, :create, :destroy] end 

这将允许您将您的Collection :: Photos与您的照片分开…

 controllers/photos_controller.rb controllers/collections/photos_controller.rb 

如果你真的想要,Rails可以让你对你的观点做同样的事情。 使用命名空间的另一个好处是它设置了一些非常漂亮的路由助手:

 photo_path(@photo) #=> /photos/1 collection_photos_path #=> /collections/1/photos etc.