路由按照定义的顺序具有优先级。因此,如果您希望 /analytics/users 由 users#index 处理,您需要先定义该路由。
namespace :analytics do
get 'users', to: "users#index"
end
resources :analytics
您似乎也不了解nested routes 的工作原理。使用资源来定义嵌套路由会将analytics/:analytic_id/users 作为索引。
resources :analytics, only: [] do
resources :users, only: [:index]
end
Prefix Verb URI Pattern Controller#Action
analytic_users GET /analytics/:analytic_id/users(.:format) users#index
但首先,这并不是一种非常轻松的方式来设置路线。我建议:
Rails.application.routes.draw do
namespace :users do
get :analytics, to: 'analytics#all'
end
resources :users, only: [] do
resources :analytics, module: :users, only: [:index]
end
end
这将给出以下路线:
Prefix Verb URI Pattern Controller#Action
users_analytics GET /users/analytics(.:format) users/analytics#all
user_analytics GET /users/:user_id/analytics(.:format) users/analytics#index
这里的主要区别在于,路由清楚地表明所代表的资源是属于用户或集合的分析。
使用module 选项将“嵌套”路由发送到Users::AnalyticsController,这是区分不同上下文的好方法。
class Users::AnalyticsController
# Display all analytics for all users
# GET /users/analytics
def all
@users = User.all
@analytics = Analytic.where(user: @users)
end
# Display all analytics for a user
# GET /users/:user_id/analytics
def index
@user = User.includes(:analytics).find(params[:user_id])
@analytics = @user.analytics
end
end