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

问题描述 投票:0回答:3

下面我给出了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的操作。

ruby-on-rails ruby ruby-on-rails-4.2 nested-routes
3个回答
0
投票

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

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

0
投票

请检查将要生成的路线

localhost:3000/rails/info/routes

那么必须是users_controller必须是controller / analytics / users_controller.rb内的命名空间

class Analytics::UsersControllers < ApplicationController
end

并且UserController操作的路径应该是

analytics_users_path & analytics_users_path(user_id)

0
投票

路由按照定义的顺序具有优先级。因此,如果您希望/analytics/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
© www.soinside.com 2019 - 2024. All rights reserved.