如何将 HTTP 201 设置为 ActionController::API#create in Ruby on Rails 的默认状态?

How to set HTTP 201 as a default status for ActionController::API#create in Ruby on Rails?

如标​​题所述,我想知道是否可以在 Rails API 控制器的创建操作 ActionController::API#create 上为所有 Ruby 全局设置 status :created使用视图呈现响应,例如 jbuilder gem.

当使用 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

我已经尝试过,尝试 "guess" Rails 语法:

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

很遗憾,没有用。

你可以这样做:

在你的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

由于您在ApplicationController中添加:set_code_on_create,这将对所有控制器全局生效。

如果您不想将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

时覆盖