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

时间:2011-02-28 23:41:20

标签: ruby-on-rails ruby-on-rails-3 routes

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

目前,用户可以通过photos/id查看所有照片。我认为如果他们可以通过collections/id/photos

浏览特定馆藏的照片也是有意义的

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

resources :photos
resources :collections do
  resources :photos
end

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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.