Що таке scope в файлі routes.rb у Rails?

scope у Rails — це метод, що використовується у файлі routes.rb для групування маршрутів, що дозволяє організовувати їх в логічні блоки. Це особливо корисно, коли у вас є кілька маршрутів, які мають спільні властивості, такі як загальний префікс URL або однакова логіка контролера.

Rails.application.routes.draw do
  scope '/admin' do
    resources :users
    resources :products
  end
end

У цьому прикладі всі маршрути для ресурсів users і products будуть мати префікс /admin. Тобто, маршрути будуть виглядати як /admin/users, /admin/users/:id, /admin/products, і так далі. Це допомагає краще організувати маршрути, зокрема, коли у вас є різні секції вашого додатку, наприклад, адміністративна панель.

scope також дозволяє застосовувати спільні параметри для маршрутизації або використовувати інші налаштування, такі як модифікація контролера або іменування маршрутів.

Або більш складний приклад:

Rails.application.routes.draw do
  # Групування маршрутів для API версії 1
  scope '/api/v1', module: 'api/v1', defaults: { format: :json } do
    resources :users do
      member do
        get 'profile'
      end

      collection do
        get 'search'
      end
    end

    resources :products do
      collection do
        get 'featured'
      end
    end
  end

  # Групування маршрутів для API версії 2
  scope '/api/v2', module: 'api/v2', defaults: { format: :json } do
    resources :users do
      member do
        get 'profile'
        put 'update_password'
      end

      collection do
        get 'search'
        post 'import'
      end
    end

    resources :products do
      collection do
        get 'featured'
        post 'bulk_update'
      end
    end
  end

  # Групування маршрутів для адміністративної панелі
  scope '/admin', module: 'admin' do
    resources :dashboard, only: [:index] do
      collection do
        get 'stats'
      end
    end

    resources :users
    resources :products
  end
end

Пояснення

  1. API Версія 1 (/api/v1)
  • Всі маршрути в цій групі мають префікс /api/v1 і використовують контролери з модуля Api::V1.

  • Для ресурсу users:

    • GET /api/v1/users/:id/profile для отримання профілю конкретного користувача.
    • GET /api/v1/users/search для пошуку користувачів.
  • Для ресурсу products:

    • GET /api/v1/products/featured для отримання featured продуктів.
  1. API Версія 2 (/api/v2)
  • Всі маршрути в цій групі мають префікс /api/v2 і використовують контролери з модуля Api::V2.

  • Для ресурсу users:

    • GET /api/v2/users/:id/profile для отримання профілю.

    • PUT /api/v2/users/:id/update_password для оновлення пароля.

    • GET /api/v2/users/search і POST /api/v2/users/import для пошуку і імпорту користувачів.

  • Для ресурсу products:

    • GET /api/v2/products/featured і POST /api/v2/products/bulk_update для featured продуктів і bulk оновлень.
  1. Адміністративна панель (/admin)
  • Всі маршрути в цій групі мають префікс /admin і використовують контролери з модуля Admin.

  • Для ресурсу dashboard:

    • GET /admin/dashboard для перегляду адмінської панелі.

    • GET /admin/dashboard/stats для перегляду статистики.

  • Для ресурсів users і products:

    • Всі стандартні CRUD маршрути для адміністративних операцій.

Цей приклад демонструє, як можна використовувати scope для створення чіткої ієрархії маршрутів, групування їх за версіями API або за різними частинами додатку, а також для налаштування форматів запитів та маршрутів.

1 Вподобання