ruby-on-rails - 如何在 Ruby on Rails 中将 HTTP 201 设置为 ActionController::API#create 的默认状态?
问题描述
正如标题所述,我想知道在使用视图呈现响应时是否可以status :created
为所有 Ruby on Rails API 控制器的创建操作全局设置ActionController::API#create
,例如使用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
任何时候用它的视图响应时都会默认渲染。
我已经尝试过,试图“猜测” 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
自从您添加以来: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
推荐阅读
- typo3 - TYPO3中通过IP地址自动认证
- sql - 未应用 SQL 字符串排除条件
- kotlin - 从 kotlin 类创建 XSD
- python - Python3:访问一个 dunder 变量
- javascript - Javascript:如何检查/比较字符串是否包含某些标签?
- java - Java - 编译器可以重新排序 CountDownLatch.await()
- swiftui - 将文本字段格式化为 2 位小数而不输入小数(SwiftUI)
- sql - 列出查询中的所有转换/聚合
- angular - Apollo Angular 返回空数据,而 Postman 请求返回具有相同查询的正确数据
- c++ - 在 Opengl 中绘制一条不显示 C++ 的线