如何将 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
时覆盖
如标题所述,我想知道是否可以在 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