如何在rails中使用操作命名空间?

时间:2017-12-20 09:36:03

标签: ruby-on-rails ruby ruby-on-rails-4.2 nested-routes

下面我给出了routes.rb的代码:

  resources :analytics

  namespace :analytics do
    resources :users, only: [:show, :index]
  end

在这里,我在controllers文件夹中有一个analytics_controller.rb,在Controllers文件夹中有一个包含这个users_controller.rb的Analytics文件夹

因此,每当我想转到http://localhost:3005/analytics/users访问users_controller的索引时,它只会将我发送到analytics_controller的show动作,因为它将“users”作为上述URL中的:id。

我该怎么办?我想同时保留analytics_controller的所有操作以及users_controller的操作。

3 个答案:

答案 0 :(得分:0)

如果您希望路由器首先匹配分析/用户路径,则需要将命名空间放在资源之前:

namespace :analytics do
  resources :users, only: [:show, :index]
end
resources :analytics

答案 1 :(得分:0)

请检查将使用

生成的路线
localhost:3000/rails/info/routes

然后必须是users_controller必须是控制器/ analytics / users_controller.rb内的命名空间

class Analytics::UsersControllers < ApplicationController
end

UserController操作的路径应为

analytics_users_path & analytics_users_path(user_id)

答案 2 :(得分:0)

路由按照定义的顺序具有优先级。因此,如果您希望用户#index处理/analytics/users,则需要先定义该路由。

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选项发送&#34;嵌套&#34;路由到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