Ruby on RailsJuniorCoding
Каковы семь RESTful маршрутов в Rails и на какие HTTP-методы/действия они отображаются?
Rails генерирует 7 RESTful маршрутов: index (GET /), show (GET /:id), new (GET /new), create (POST /), edit (GET /:id/edit), update (PATCH/PUT /:id), destroy (DELETE /:id).
Семь RESTful маршрутов в Rails
Одна строка resources :articles в config/routes.rb автоматически создаёт семь маршрутов, соответствующих CRUD-операциям.
# config/routes.rb
Rails.application.routes.draw do
resources :articles
end
Таблица маршрутов
$ rails routes -c articles
Verb URI Pattern Controller#Action
GET /articles articles#index
POST /articles articles#create
GET /articles/new articles#new
GET /articles/:id/edit articles#edit
GET /articles/:id articles#show
PATCH /articles/:id articles#update
PUT /articles/:id articles#update
DELETE /articles/:id articles#destroy
Описание каждого действия
- index —
GET /articles— список всех ресурсов. - show —
GET /articles/:id— один ресурс по ID. - new —
GET /articles/new— форма создания. - create —
POST /articles— сохранение нового ресурса. - edit —
GET /articles/:id/edit— форма редактирования. - update —
PATCH /articles/:id(или PUT) — сохранение изменений. - destroy —
DELETE /articles/:id— удаление ресурса.
Пример контроллера
class ArticlesController < ApplicationController
before_action :set_article, only: %i[show edit update destroy]
def index
@articles = Article.all
end
def show; end
def new
@article = Article.new
end
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article, notice: "Created!"
else
render :new, status: :unprocessable_entity
end
end
def edit; end
def update
if @article.update(article_params)
redirect_to @article, notice: "Updated!"
else
render :edit, status: :unprocessable_entity
end
end
def destroy
@article.destroy
redirect_to articles_path, status: :see_other
end
private
def set_article
@article = Article.find(params[:id])
end
def article_params
params.require(:article).permit(:title, :body)
end
end
Ограничение маршрутов
# Только чтение
resources :articles, only: %i[index show]
# Исключить отдельные действия
resources :articles, except: %i[destroy]
# Вложенные ресурсы
resources :articles do
resources :comments
end
# Singleton-ресурс (нет :id, нет index)
resource :profile
Именованные хелперы
articles_path # => /articles
new_article_path # => /articles/new
article_path(@a) # => /articles/1
edit_article_path(@a)# => /articles/1/edit
Подводные камни
- Маршрут
new(/articles/new) должен идти в таблице раньшеshow(/articles/:id), иначе «new» будет воспринят как ID. Rails обеспечивает это автоматически, но при ручном описании маршрутов нужно следить за порядком. - Браузеры не поддерживают PATCH/DELETE напрямую; Rails использует скрытое поле
_methodв формах. Если форма не использует Rails-хелперы, метод не будет подставлен. - Вложенные ресурсы глубже двух уровней усложняют URLs и логику — Rails-гайды рекомендуют ограничиваться одним уровнем.
resourcesсоздаёт маршрутPUTнаряду сPATCH; предпочтителенPATCHдля частичных обновлений.- При использовании
resource :profile(singleton) нет маршрутаindexи параметра:id— контроллер должен находить запись другим способом (например, по текущему пользователю). - Именованные хелперы
_pathвозвращают относительный путь,_url— абсолютный URL с доменом. Для email-шаблонов нужны_url. - Добавление нестандартных действий через
member/collection— нормально, но злоупотребление ими сигнализирует о необходимости выделить новый ресурс. rails routesв большом приложении вывод огромен — используйте-c controller_nameили-g patternдля фильтрации.
Common mistakes
- Сводить restful routes к названию метода без lifecycle и failure path.
- Игнорировать модель runtime: Rails 8.1 строит приложение вокруг Rack, routing, controllers, Active Record, views и conventions over configuration.
- Не отделять validation, authorization, transaction boundary и business logic.
What the interviewer is testing
- Объясняет restful routes через конкретную точку lifecycle в Ruby on Rails.
- Приводит корректный минимальный пример без вымышленных методов или callbacks.
- Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.