Spec-Zone.ru › Ruby on Rails 8.1

класс ActionController::API

Контроллер действий API

API — это облегчённая версия ActionController::Base, созданная для приложений, которым не нужны все возможности, предоставляемые полноценным контроллером Rails. Она позволяет создавать контроллеры только с теми функциями, которые нужны для приложений, использующих только API.

Контроллер API отличается от обычного контроллера тем, что по умолчанию в него не включен ряд возможностей, обычно необходимых только при доступе через браузер: рендеринг макетов и шаблонов, flash-сообщения, ресурсы и так далее. Благодаря этому весь стек контроллера становится легче и подходит для приложений API. Это не значит, что такие возможности недоступны, если они вам нужны: все они доступны для включения в приложение, просто не входят в стек контроллера API по умолчанию.

Обычно только ApplicationController наследуется от ActionController::API. Все остальные контроллеры, в свою очередь, наследуются от ApplicationController.

Пример контроллера:

class PostsController < ApplicationController
  def index
    posts = Post.all
    render json: posts
  end
end

Объекты запроса, ответа и параметров работают точно так же, как в ActionController::Base.

Рендеринг

Стек контроллера API по умолчанию включает все средства рендеринга, поэтому в контроллерах можно свободно использовать render :json и аналогичные методы. Имейте в виду, что шаблоны рендериться не будут, поэтому необходимо убедиться, что во всех действиях контроллера вызывается либо render, либо redirect_to. В противном случае будет возвращён 204 No Content.

def show
  post = Post.find(params[:id])
  render json: post
end

Перенаправления

Перенаправления используются для перехода от одного действия к другому. В контроллерах можно использовать метод redirect_to так же, как и в ActionController::Base. Например:

def create
  redirect_to root_url and return if not_authorized?
  # do stuff here
end

Добавление новых возможностей

В некоторых случаях может потребоваться добавить часть функциональности ActionController::Base, которая по умолчанию отсутствует в ActionController::API, например MimeResponds. Этот модуль предоставляет метод respond_to. Добавить его довольно просто: достаточно включить модуль в конкретный контроллер или в ApplicationController, если он должен быть доступен во всём приложении:

class ApplicationController < ActionController::API
  include ActionController::MimeResponds
end

class PostsController < ApplicationController
  def index
    posts = Post.all

    respond_to do |format|
      format.json { render json: posts }
      format.xml  { render xml: posts }
    end
  end
end

Если вам нужны другие возможности, не предоставляемые ActionController::API из коробки, ознакомьтесь со списком модулей, включённых в ActionController::Base.

Константы

MODULES

Общедоступные методы класса

without_modules (*modules) Показать исходный код
# File actionpack/lib/action_controller/api.rb, line 108
def self.without_modules(*modules)
  modules = modules.map do |m|
    m.is_a?(Symbol) ? ActionController.const_get(m) : m
  end

  MODULES - modules
end

Вспомогательный метод, возвращающий все модули ActionController::API, кроме переданных в качестве аргументов:

class MyAPIBaseController < ActionController::Metal
  ActionController::API.without_modules(:UrlFor).each do |left|
    include left
  end
end

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

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API