首页 > 解决方案 > 如何在 Ruby on Rails 中将 HTTP 201 设置为 ActionController::API#create 的默认状态?

问题描述

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

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

不幸的是,无济于事。

标签: ruby-on-railsrubyruby-on-rails-5ruby-on-rails-6

解决方案


你可以这样做:

在你的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_createApplicationController这将对所有控制器全局生效。

如果您不想更改任何控制器(例如)的操作状态,那么201您可以跳过此操作:#createArticles ControllerArticlesController

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

编辑1:由于上面将覆盖其他响应代码,例如401(或422其他),这是不可取的,因此if response.status == 200如果响应状态为,则包含仅覆盖:ok


推荐阅读