1

我正在尝试为嵌套在“用户”模型中的“页面”模型设置路由。只有“页面”需要足智多谋。(用户 has_many pages)

这是我原来的做法:

resources :users, path: '', only: [] do
  resources :pages, path: ''
end

以上对我来说很好。我得到的路线是:

      user_pages GET    /:user_id(.:format)                 pages#index
                 POST   /:user_id(.:format)                 pages#create
  new_user_pages GET    /:user_id/new(.:format)             pages#new
 edit_user_pages GET    /:user_id/:id/edit(.:format)        pages#edit
      user_pages GET    /:user_id/:id(.:format)             pages#show
                 PUT    /:user_id/:id(.:format)             pages#update
                 DELETE /:user_id/:id(.:format)             pages#destroy

这对我来说很有意义,因为/john-doe/page1会是user_pages_path(@user, @user.pages.first).

但是,new_user_pages 没有意义,因为用户只能为自己/她自己创建一个页面。因此,每个用户都应该访问/new,而不是“/:user_id/new”。此外,如果用户访问另一个用户的 ":another_user_id/new" 会发生什么?(做 new_pages_path 和 '/new' 而不是new_user_pages_pathand会更有意义/:user_id/new)。

我尝试执行上述路由的另一种方法:

我还意识到,由于 ":users" 不需要足智多谋,因此可以以更短的方式完成上述操作:

resources :pages, path => :user_id

但是,这导致路径中没有“用户”:

      pages GET    /:user_id(.:format)                 pages#index
            POST   /:user_id(.:format)                 pages#create
  new_pages GET    /:user_id/new(.:format)             pages#new
 edit_pages GET    /:user_id/:id/edit(.:format)        pages#edit
      pages GET    /:user_id/:id(.:format)             pages#show
            PUT    /:user_id/:id(.:format)             pages#update
            DELETE /:user_id/:id(.:format)             pages#destroy

这样做的“rails”方式是什么?另外,我应该从资源中删除“新”并单独定义它吗?

另外,使用范围命名空间是否有意义?

谢谢,尼克

4

1 回答 1

0

你为什么不希望你的路线遵循这种new_user_pages_path格式?我可能不知道按照您想要的方式执行此操作的原因,但对我来说,当我的所有嵌套资源路径都遵循相同的格式时,它会容易得多。

要回答有关阻止用户访问的问题/:another_user_id/new,您可以通过添加 abefore_filter来防止这种情况,以确保传递给新操作的 id 与当前登录的用户的 id 匹配。

这是我在当前正在构建的应用程序中使用的:

things_controller.rb

class VendorsController < ApplicationController
  #other filters
  before_filter :correct_user

  #controller methods

  private
    def correct_user
      if params[:user_id]
        @user = User.find(params[:user_id])
        unless @user && current_user == @user
          redirect_to(root_path)
        end
      else
        redirect_to(root_path)
      end
    end
end

当然,你需要一个 current_user 方法才能工作(我的来自设计)。

于 2013-08-04T03:30:35.233 回答