我正在尝试为嵌套在“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”并单独定义它吗?
此外,使用范围或命名空间是否有意义?
谢谢, 尼克
答案 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方法来实现它(我来自设计)。