【问题标题】:How to have a namespace with action in rails?如何在 Rails 中有一个带有动作的命名空间?
【发布时间】:2018-06-02 19:47:46
【问题描述】:

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

  resources :analytics

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

在这里,我在控制器文件夹中有一个 analytics_controller.rb,在 Controllers 文件夹中有一个 Analytics 文件夹,其中包含此 users_controller.rb

因此,每当我想去http://localhost:3005/analytics/users 访问users_controller 的索引时,它只会将我发送到analytics_controller 的显示操作,因为它将“用户”作为上述网址中的:id。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      请检查将要生成的路线

      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)
      

      【讨论】:

        【解决方案3】:

        路由按照定义的顺序具有优先级。因此,如果您希望 /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
        

        【讨论】:

        • 路线"/users/analytics" 非常规。显示整个集合的嵌套记录是非常罕见的,但如果你真的想这样做的话。
        猜你喜欢
        • 2019-02-22
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        相关资源
        最近更新 更多