添加:user_id到资源(rails3路由)

时间:2013-08-04 01:24:29

标签: ruby-on-rails routes

我正在尝试为嵌套在“User”模型中的“Page”模型设置路由。只有“页面”需要资源丰富。 (用户has_many页面)

这是我原创的方式:

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_path/:user_id/new更有意义。

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

我也意识到,由于“:用户”不需要足智多谋这一事实,上述工作可以用更短的方式完成:

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

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

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

谢谢, 尼克

1 个答案:

答案 0 :(得分:0)

为什么您不希望您的路线遵循new_user_pages_path格式?可能有理由按照您不想要的方式执行此操作,但对我而言,当所有嵌套资源路径遵循相同格式时,它会更容易。

要回答有关阻止用户访问/:another_user_id/new的问题,可以通过添加before_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方法来实现它(我来自设计)。