【发布时间】:2019-02-19 14:51:27
【问题描述】:
如果请求是通过 AJAX 进行的,我想用 JSON 响应 CanCan::AccessDenied,但无论如何它总是以状态 200 和重定向响应。我想实现这个答案:https://stackoverflow.com/a/10013873/148844。我不知道它是如何将状态 302 覆盖到 200 的,更不用说不渲染 JSON。我也试过format.js,但没用。
application_controller.rb
class ApplicationController < ActionController::Base
include CanCan::ControllerAdditions
rescue_from CanCan::AccessDenied do |exception|
flash[:warning] = exception.message
logger.info exception
respond_to do |format|
logger.info "format: " + format.to_s
format.html do
if user_signed_in? && current_user.type
redirect_to "/dashboard"
else
redirect_to root_path
end
end
format.json do
render json: {success: false, message: 'Access Denied: '+exception.message}, status: 401
end
end
end
CoffeeScript
$.post "/topics/order", {'id_order[]': arr}, (data, textStatus, jqXHR) ->
...
Gemfile
gem 'cancancan', '~> 1.10'
Console
Started POST "/topics/order" for ::1 at 2018-09-14 14:44:33 -0400
...
You are not authorized to access this page.
format: #<ActionController::MimeResponds::Collector:0x0000000d4b2a28>
Redirected to http://localhost:3000/dashboard
Completed 200 OK in 314ms (ActiveRecord: 28.0ms)
https://github.com/CanCanCommunity/cancancan#4-handle-unauthorized-access
https://api.rubyonrails.org/classes/ActionController/MimeResponds.html#method-i-respond_to
我做了一些测试并添加了
format.json { head :forbidden, content_type: 'text/html' }
format.js { head :forbidden, content_type: 'text/html' }
到respond_to 块的顶部,它确实有效。当移动到块的底部时,它不起作用。 Rails 似乎正在响应它看到的第一个format,无论格式如何!
【问题讨论】:
标签: jquery ruby-on-rails json ajax cancancan