Как маршрутизация работает в Rails, с движками и другими фреймворками.

Маршрутизация является жизненно важным компонентом разработки веб-приложений, направляя входящие запросы соответствующим обработчикам и отображая путешествие пользователя по различным страницам и модулям.

В Ruby on Rails система маршрутизации предоставляет мощный механизм, который следует соглашениям RESTful и упрощает обработку URL-адресов. В этой статье мы рассмотрим, как работает маршрутизация в Rails, изучим его различные функции, интеграцию с движками, мой личный опыт и сравнение с другими языковыми фреймворками.

Как это работает в Rails

Маршруты в Rails следуют DSL (Domain-Specific Language), который позволяет создавать краткие и удобочитаемые объявления маршрутов. Файл config/routes.rb служит точкой входа для определения маршрутов приложений. Он содержит набор сопоставлений маршрутов, которые определяют, как приложение должно обрабатывать URL-адреса.

Маршруты в Rails определяются с использованием методов get, post, put, patch, delete или match, соответствующих различным глаголам HTTP.

Базовый синтаксис для определения маршрута — verb 'path', to: 'controller#action', где verb представляет метод HTTP, path обозначает шаблон URL, а controller#action указывает соответствующий контроллер и действие для обработки запроса.

Rails также обеспечивает ресурсную маршрутизацию с использованием метода resources, который генерирует RESTful-маршруты для заданного ресурса, включая операции CRUD.

# routes.rb
Rails.application.routes.draw do
  resources :users do
    resources :posts
  end
end

Это определяет маршруты для операций CRUD как для пользователей, так и для сообщений, создавая URL-адреса, такие как /users/1/posts, для доступа к сообщениям, принадлежащим конкретному пользователю.

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

Маршруты часто включают динамические сегменты, представленные в виде параметров. Эти сегменты обозначаются двоеточием (:), за которым следует имя параметра.

get '/posts/:post_id', to: 'posts#show'

Rails генерирует помощники пути, которые упрощают создание URL-адресов для маршрутов. Для приведенного выше примера соответствующий вспомогательный метод пути будет post_path, который принимает post_id в качестве аргумента.

Ограничения маршрута

Ограничения маршрута позволяют вам накладывать условия на маршрут, такие как принятие определенных форматов параметров или соответствие пользовательской логике. Ограничения определяются с помощью параметра constraints, который принимает блок кода.

get '/posts/:post_id', to: 'posts#show', constraints: { post_id: /\d+/ }

resources :comments, constraints: AuthConstraint.new

Первое ограничение гарантирует, что параметр post_id соответствует регулярному выражению \d+, которое представляет одну или несколько цифр. AuthConstraint — это настраиваемое ограничение, которое проверяет, вошел ли пользователь в систему, прежде чем разрешить доступ к ресурсу комментариев.

Rails позволяет вам дополнительно настраивать маршруты, предоставляя такие параметры, как настраиваемые ограничения маршрута, значения маршрута по умолчанию и область действия маршрута.

# routes.rb
Rails.application.routes.draw do
  scope module: 'api' do
    namespace :v1 do
      resources :posts
    end
  end
end

Это определяет версионный API, в котором все маршруты имеют префикс /api/v1.

Двигатели

Движки — это миниатюрные приложения, которые можно монтировать в более крупное приложение Rails, добавляя дополнительные функциональные возможности и компоненты. Они позволяют упаковывать и повторно использовать функциональные возможности в нескольких приложениях или в монолитном приложении.

Двигатели предоставляют способ инкапсулировать повторно используемые функции в автономные блоки, включая их собственные маршруты. Движки имеют собственную структуру каталогов, содержащую модели, контроллеры, представления и другие необходимые компоненты.

Движки определяют свои маршруты с помощью метода routes.draw, как и в обычном приложении Rails. Движок монтируется в файл routes.rb родительского приложения с помощью метода mount.

Метод mount используется для указания префикса URL и механизма монтирования. Подключив механизм, родительское приложение получает доступ к его функциям и маршрутам. Маршруты смонтированного движка теперь доступны через указанный префикс URL.

Rails.application.routes.draw do
  mount NewEngine::Engine => '/new_engine'
  # Define main application routes here
end

Это монтирует маршруты NewEngine под префиксом URL-адреса /new_engine в основном приложении. Существуют сценарии, в которых вы можете захотеть разделить маршруты между движком и родительским приложением. Rails предоставляет механизмы для совместного использования маршрутов путем определения проблем маршрута.

Мы можем изменить или добавить маршруты в родительском приложении, чтобы настроить поведение установленного движка. Это позволяет нам адаптировать маршруты движка в соответствии с конкретными требованиями приложения.

Будьте осторожны при установке нескольких модулей в одном приложении, так как могут возникнуть конфликтующие маршруты. Рассмотрите возможность определения области действия или пространства имен, чтобы предотвратить конфликты маршрутов.

Некоторые из распространенных ошибок при определении маршрутов включают:

  • Не организация маршрутов в файлы меньшего размера. Избегайте использования одного монолитного routes.rb файла, которым становится сложно управлять по мере масштабирования приложения.
  • Несоблюдение соглашений RESTful для находчивой маршрутизации. Избегайте отклонения от стандартных соглашений, если в этом нет крайней необходимости.
  • Перегрузка маршрутов слишком большим количеством действий. Сосредоточьтесь на маршрутах и ​​избегайте ненужной сложности.
  • Не использовать помощники маршрута для генерации URL.
  • Неправильный охват маршрутов. Обеспечьте правильную область видимости, чтобы предотвратить конфликты маршрутов и сохранить организованность кодовой базы.

Маршрутизация в других фреймворках

Маршрутизация запросов как функциональность остается неизменной для многих фреймворков веб-приложений, независимо от используемого основного языка программирования. Но функции, которые приходят с ним, или уровень контроля над доступными обработчиками определенно различаются.

Rails славится своим подходом «конвенция над конфигурацией» и принципами маршрутизации RESTful. Rails использует промежуточное ПО, такое как Rack, для обработки различных преобразований запроса/ответа и выполнения дополнительной обработки до и после маршрутизации.

Весна

Если вы пришли из мира Java (как и я), где Spring был в основном используемой серверной средой, вы бы использовали аннотации для сопоставления запросов с конкретными методами контроллера. Аннотирование методов контроллера с помощью @RequestMapping позволяет отображать URL-адреса и обрабатывать параметры.

Spring MVC поддерживает различные параметры сопоставления, включая переменные пути, параметры запроса, заголовки и методы HTTP. Эта гибкость позволяет точно контролировать сопоставление маршрутов. Он предоставляет перехватчики и фильтры для перехвата и обработки запросов на различных этапах, что позволяет выполнять такие распространенные задачи, как аутентификация.

Подход на основе аннотаций обеспечивает краткий способ сопоставления URL-адресов с методами контроллера. Однако он требует явного объявления маршрутов, что может привести к более подробному коду по сравнению с подходом, основанным на соглашениях Rails.

Джанго

В Django маршрутизация в основном определяется с помощью шаблонов URL, которые представляют собой регулярные выражения Python или шаблоны маршрутов. Шаблоны URL определяются в модуле urls.py, который служит точкой входа для определения маршрутов приложений.

path() для определения шаблонов URL для сопоставления на основе пути. Шаблоны пути могут включать переменные и преобразователи для захвата динамических сегментов URL-адреса.

from django.urls import path
from . import views

urlpatterns = [
    path('products/<int:product_id>/', views.product_detail),
]

При определении маршрута вы сопоставляете его с определенной функцией представления или классом, который будет обрабатывать запрос. Функции просмотра получают объект request в качестве аргумента и возвращают экземпляр HttpResponse или его подклассы.

Правильная организация шаблонов URL в модуле urls.py имеет решающее значение для удобочитаемости и удобства обслуживания. Django обрабатывает шаблоны сверху вниз, поэтому более конкретные шаблоны должны следовать перед более общими, чтобы обеспечить их правильное сопоставление.

Хотя Django обеспечивает гибкость в определении пользовательских шаблонов маршрутов, использование регулярных выражений иногда может сделать код менее читаемым.

Go

Маршрутизация обычно обрабатывается с помощью пакета net/http, где маршруты явно определены и связаны с функциями обработчика. Маршруты определяются с помощью функции http.HandleFunc или интерфейса http.HandlerFunc.

Система маршрутизации Go известна своей исключительной производительностью благодаря присущей языку эффективности и принципам проектирования. Этот подход дает разработчикам полный контроль над маршрутизацией, но требует ручной настройки.

Я упомянул Spring, Django и Go, так как они предлагают большую гибкость, позволяя детально контролировать и настраивать сопоставление маршрутов. Rails упрощает процесс маршрутизации и обеспечивает чистый и удобный для сопровождения код, что делает его отличным выбором для быстрой разработки и соблюдения принципов RESTful.

Сравнение лучше проводить при выборе фреймворка, который лучше всего соответствует потребностям вашего проекта. Маршрутизация запросов на уровне приложения, возможно, не является главным фактором при принятии решений, но учет этого помогает нам делать осознанный выбор.

Если вам интересно читать подобные статьи, пожалуйста, подпишитесь на меня на Medium.

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу