【发布时间】:2011-02-17 04:26:07
【问题描述】:
我觉得嵌套路由有一个很常见的情况,看起来像这样(在某种伪符号中):
'/:username/photos' => Show photos for User.find_by_username
'/photos' => Show photos for User.all
简而言之:我有用户。他们有照片。我希望能够在他们的页面上展示他们的照片。我还希望能够显示所有照片,无论用户如何。我想让我的路由保持 RESTful 并使用内置的 resource 方法感觉是正确的方法。
选项 1 这样做是让 PhotosController#index 使用条件来检查给出了哪些参数并获取照片列表并设置视图(对于用户的照片与所有照片不同) )。路由它甚至很容易:
resources :photos, :only => [:index]
scope ':/username' do
resources :photos
end
轰隆隆。 似乎 Rails 就是为此设置的。然而,在路线之后,事情变得更加复杂。 PhotosController#index 操作中的条件返回变得越来越臃肿,并且正在做大量的委托。随着应用程序的增长以及我想展示照片的方式的数量也在增长,它只会变得更糟。
选项 2 可能是使用 User::PhotosController 来处理用户照片,并使用 PhotosController 来处理显示所有照片。
resources :photos, :only => [:index]
namespace :user, :path => '/:username' do
resources :photos
end
生成以下路由:
photos GET /photos(.:format) {:action=>"index", :controller=>"photos"}
user_photos GET /:username/photos(.:format) {:action=>"index", :controller=>"user/photos"}
POST /:username/photos(.:format) {:action=>"create", :controller=>"user/photos"}
new_user_photo GET /:username/photos/new(.:format) {:action=>"new", :controller=>"user/photos"}
edit_user_photo GET /:username/photos/:id/edit(.:format) {:action=>"edit", :controller=>"user/photos"}
user_photo GET /:username/photos/:id(.:format) {:action=>"show", :controller=>"user/photos"}
PUT /:username/photos/:id(.:format) {:action=>"update", :controller=>"user/photos"}
DELETE /:username/photos/:id(.:format) {:action=>"destroy", :controller=>"user/photos"}
我认为这很好用,但一切都在一个用户模块下,当我将它与其他东西集成时,我觉得这最终可能会导致问题。
问题
- 有人有类似的经验吗?
- 谁能分享更好的处理方法?
- 这些选项中的任何一个都需要考虑其他优点和缺点吗?
更新:我继续实施选项 2,因为它让 Rails 的逻辑工作而不是覆盖它感觉更清晰。到目前为止一切进展顺利,但我还需要将我的命名空间重命名为 :users 并添加一个 :as => :user 以防止它与我的 User 模型发生冲突。我还覆盖了User 模型上的to_param 方法以返回用户名。路径助手仍然以这种方式工作。
我仍然希望得到有关此方法的反馈。我是按预期的方式做事,还是滥用了这个功能?
【问题讨论】:
-
当然,你可以问任何你想要的,但是你要求 RESTful 路由和明确要求像 /:username/photos 这样肯定不是 RESTful 的路由有点自相矛盾。我认为这个问题即使对于像 /users/:user_id/photos 这样的真正 RESTful 路由也是有效的,如果找到了针对这种情况的解决方案,而不是另一个问题,如何调整路由以映射到你需要的方式(如果你真的需要它,我认为这不是一个好主意,whatif some :username is photos ;-) 那么路线等存在冲突...)
-
@gom RESTful 与实际的 URL 段无关。它与利用 HTTP 请求动词(GET、POST、PUT、DELETE)来确定适当的操作有关。至于虚 URL(如
/:username),这很常见。虽然它在这里被争论得令人作呕,但这并不是导致问题的部分。您可以轻松验证用户名不在保留名称列表中,并且由于我的路由设置正确,它不能覆盖我的任何其他路由。
标签: ruby-on-rails ruby ruby-on-rails-3 routing