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

Описание каждого действия

  • indexGET /articles — список всех ресурсов.
  • showGET /articles/:id — один ресурс по ID.
  • newGET /articles/new — форма создания.
  • createPOST /articles — сохранение нового ресурса.
  • editGET /articles/:id/edit — форма редактирования.
  • updatePATCH /articles/:id (или PUT) — сохранение изменений.
  • destroyDELETE /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.

Sources

Related topics