Как установить HTTP 201 как статус по умолчанию для ActionController :: API # create в Ruby на Rails? - PullRequest
0 голосов
/ 17 апреля 2020

Как гласит заголовок, мне интересно, возможно ли глобально установить status :created для всех Ruby в действии create контроллеров Rails API ActionController::API#create при рендеринге ответа с использованием Views, например, с jbuilder gem.

При использовании гема нет необходимости явно вызывать метод render, все, что мне нужно, это действие создания моих контроллеров

def create
  @tv_show = current_user.tv_shows.build(tv_show_params)
  @tv_show.validate
  render_unprocessable_entity(@tv_show.errors.messages) and return if @tv_show.errors.present?

  @tv_show.save
end

и соответствующий файл представления, который в данном случае является app/views/tv_shows/create.json.jbuilder.

Кажется, что Rails по умолчанию отображает status :ok по умолчанию всякий раз, когда он отвечает своим представлением.

То, что я пробовал, пытаясь "угадать" синтаксис Rails:

class ApplicationController < ActionController::API
  status: :created, only: :create
end

К сожалению, безрезультатно.

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете сделать что-то вроде этого:

В вашем ApplicationController

class ApplicationController < ActionController::API
  after_action :set_code_on_create, only: [:create]

  private
    def set_code_on_create
      response.status = 201 if response.status == 200
    end
end

Поскольку вы добавили :set_code_on_create в ApplicationController, это вступит в силу глобально для всех контроллеров.

Если вы не хотите изменять статус действия 201 на #create какого-либо контроллера (скажем, Articles Controller), то в ArticlesController вы можете пропустить это:

class ArticlesController < ApplicationController
  skip_after_action :set_code_on_create, only: [:create]
end

РЕДАКТИРОВАТЬ 1: Так как выше будут переопределять другие коды ответа, такие как 401 (или 422 или другие), что нежелательно, поэтому включите if response.status == 200, чтобы просто переопределить, если статус ответа :ok

...