Маршрутизация в Rails — это система, которая сопоставляет HTTP-запросы с соответствующими контроллерами и действиями. Рассмотрим все аспекты работы с маршрутами.
Все маршруты определяются в config/routes.rb
:
Rails.application.routes.draw do
# Ваши маршруты здесь
end
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 |
resource :profile
Используется для ресурсов, которые существуют в единственном числе (без :id)
get 'about', to: 'pages#about'
post 'subscribe', to: 'subscriptions#create'
resources :articles do
resources :comments
end
Генерирует пути вида /articles/:article_id/comments
resources :photos, only: [:index, :show]
resources :users, except: [:destroy]
get 'exit', to: 'sessions#destroy', as: :logout
Теперь можно использовать logout_path
namespace :admin do
resources :articles
end
Маршруты будут начинаться с /admin
, контроллеры в модуле Admin
scope module: 'api' do
resources :articles
end
scope '/api' do
resources :articles
end
get 'products/:id', to: 'products#show'
Доступны в params[:id]
resources :articles, constraints: { id: /\d+/ }
get 'photos/:id', to: 'photos#show', constraints: { id: /[A-Z]\d{5}/ }
get 'photos/:id', to: 'photos#show', defaults: { format: 'jpg' }
Команда для просмотра всех маршрутов:
rails routes
# Или для фильтрации
rails routes -g article
constraints lambda { |req| req.ip == '127.0.0.1' } do
get 'admin', to: 'admin#index'
end
class AdminConstraint
def matches?(request)
request.session[:admin]
end
end
constraints AdminConstraint.new do
get 'admin', to: 'admin#index'
end
Для 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
Резюмируем: система маршрутизации Rails предоставляет гибкие инструменты для определения URL-структуры приложения, поддерживая RESTful-подход, пространства имен, ограничения и пользовательские маршруты. Правильная организация маршрутов делает приложение более понятным и поддерживаемым.