класс ActionController::API
API Контроллер — это облегчённая версия ActionController::Base, созданная для приложений, которым не требуются все функции полноценного контроллера Rails, позволяя создавать контроллеры только с необходимыми функциями для приложений 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
Публичные методы класса
# File actionpack/lib/action_controller/api.rb, line 103
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(:ForceSSL, :UrlFor).each do |left|
include left
end
end
Это позволяет лучше контролировать, что вы хотите исключить, и упрощает создание класса контроллера API, вместо того, чтобы вручную перечислять необходимые модули.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.