可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Am using Rails 3.0.19 and JBuilder Gem 2.0.6 to render JSON responses.
JBuilder: https://github.com/rails/jbuilder
Following is the code am using to send error-messages for a specific API.
render :json, :template=>"/api/shared/errors.json.jbuilder", :status=> :bad_request
For some reason, the client receives 200-ok status. While, I have expected 400 (bad_request).
Any help, please?
Here is my code in detail:
def render_json_error_messages #render :template=> "/api/shared/errors.json.jbuilder", :status=> :bad_request, :formats => [:json] respond_to do |format| format.json { render :template=> "/api/shared/errors.json.jbuilder", :status=> 400 } end end
And in a before_filter method, I use render_json_error_messages
回答1:
This works:
controller
def some_action render status: :bad_request end
some_action.jbuilder
json.something "test"
回答2:
Try rendering jbuilder to string then set the status... works in Rails 4.1.4
jstr = render_to_string( template: 'api/shared/index.jbuilder', locals: { nodes: @nodes}) respond_to do |format| format.html format.json { render json: jstr, status: :bad_request } end
Else following also works
format.json { render template: 'api/shared/index.jbuilder', status: 404 }
回答3:
I don't know about Rails 3.0, but I was able to provide the appropriate status by simply adding a respond_to
block to the controller action. As an example, I have an create
like so:
def create # ... create logic respond_to do |format| format.html format.json { render status: :created, success: true } end
The above code sets my status code to 201 and renders app/views/orders/create.json.jbuilder
Hope that helps.
回答4:
maybe reverse the thinking:
@pictures = ... respond_to do |format| format.html format.json do if @error.present? # @error contains some error message render json: @error, status: :unprocessable_entity else render template: 'api/shared/index.jbuilder' end end
api/shared/index.jbuilder
json.array! @pictures, :id, :filename, :width, :height
works in Rails5.1.4