Spec-Zone.ru › Ruby on Rails 7.1

class ActionController::API

Родитель:
Metal

Контроллер Action Controller API

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

Контроллер API отличается от обычного контроллера тем, что по умолчанию не включает ряд функций, обычно необходимых для доступа через браузер: рендеринг макетов и шаблонов, всплывающие сообщения, активы и т. д. Это делает всю цепочку контроллера более тонкой, подходящей для 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::Base, если хотите использовать любые другие функции, которые не предоставляются ActionController::API по умолчанию.

Константы

MODULES

Публичные методы класса

without_modules(*modules) Показать исходный код
# File actionpack/lib/action_controller/api.rb, line 106
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