Как обрабатывать маршруты в Rails?ruby-44

Маршрутизация в Rails — это система, которая сопоставляет HTTP-запросы с соответствующими контроллерами и действиями. Рассмотрим все аспекты работы с маршрутами.

Основной файл маршрутизации

Все маршруты определяются в config/routes.rb:

Rails.application.routes.draw do
  # Ваши маршруты здесь
end

Основные типы маршрутов

1. Ресурсные маршруты

resources :articles

Создает 7 стандартных маршрутов: | HTTP-метод | Путь | Контроллер#действие | Имя маршрута | |------------|--------------|----------------------|-----------------| | GET | /articles | articles#index | articles_path | | GET | /articles/new | articles#new | new_article_path| | POST | /articles | articles#create | articles_path | | GET | /articles/:id | articles#show | article_path | | GET | /articles/:id/edit | articles#edit | edit_article_path| | PATCH/PUT | /articles/:id | articles#update | article_path | | DELETE | /articles/:id | articles#destroy | article_path |

2. Одиночные ресурсы

resource :profile

Используется для ресурсов, которые существуют в единственном числе (без :id)

3. Пользовательские маршруты

get 'about', to: 'pages#about'
post 'subscribe', to: 'subscriptions#create'

Дополнительные возможности

1. Вложенные ресурсы

resources :articles do
  resources :comments
end

Генерирует пути вида /articles/:article_id/comments

2. Ограничение действий

resources :photos, only: [:index, :show]
resources :users, except: [:destroy]

3. Именованные маршруты

get 'exit', to: 'sessions#destroy', as: :logout

Теперь можно использовать logout_path

4. Пространства имен

namespace :admin do
  resources :articles
end

Маршруты будут начинаться с /admin, контроллеры в модуле Admin

5. Области видимости

scope module: 'api' do
  resources :articles
end

scope '/api' do
  resources :articles
end

Параметры маршрутов

1. Динамические сегменты

get 'products/:id', to: 'products#show'

Доступны в params[:id]

2. Ограничения форматов

resources :articles, constraints: { id: /\d+/ }
get 'photos/:id', to: 'photos#show', constraints: { id: /[A-Z]\d{5}/ }

3. Значения по умолчанию

get 'photos/:id', to: 'photos#show', defaults: { format: 'jpg' }

Просмотр маршрутов

Команда для просмотра всех маршрутов:

rails routes
# Или для фильтрации
rails routes -g article

Пользовательские ограничения

1. По IP-адресу

constraints lambda { |req| req.ip == '127.0.0.1' } do
  get 'admin', to: 'admin#index'
end

2. Собственные классы ограничений

class AdminConstraint
  def matches?(request)
    request.session[:admin]
  end
end

constraints AdminConstraint.new do
  get 'admin', to: 'admin#index'
end

API-маршруты

Для API-режима:

namespace :api do
  scope module: :v1 do
    resources :articles
  end
end

Тестирование маршрутов

Пример теста RSpec:

RSpec.describe "Routing", type: :routing do
  it "routes to articles#index" do
    expect(get: "/articles").to route_to("articles#index")
  end
end

Лучшие практики

  1. Придерживайтесь RESTful там, где это возможно
  2. Избегайте глубокой вложенности ресурсов (максимум 1 уровень)
  3. Используйте пространства имен для админ-панелей и API
  4. Ограничивайте действия только необходимыми
  5. Добавляйте ограничения для валидации параметров

Резюмируем: система маршрутизации Rails предоставляет гибкие инструменты для определения URL-структуры приложения, поддерживая RESTful-подход, пространства имен, ограничения и пользовательские маршруты. Правильная организация маршрутов делает приложение более понятным и поддерживаемым.