【问题标题】:How do I respond to CanCan::AccessDenied with an AJAX JSON response?如何使用 AJAX JSON 响应响应 CanCan::AccessDenied?
【发布时间】: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


    【解决方案1】:

    我在帖子中添加了json 作为dataType,现在它正在工作。

    $.post "/topics/order", {'id_order[]': arr}, (data, textStatus, jqXHR) ->
      ...
    , 'json'
    

    https://api.jquery.com/jquery.ajax/#jQuery-ajax-settings

    数据类型(默认:智能猜测(xml、json、脚本或 html))
    类型:字符串
    您期望从服务器返回的数据类型。如果没有指定,jQuery 将尝试根据响应的 MIME 类型推断它(XML MIME 类型将产生 XML,在 1.4 中 JSON 将产生一个 JavaScript 对象,在 1.4 中脚本将执行脚本,其他任何东西都会作为字符串返回)。可用类型(以及作为第一个参数传递给成功回调的结果)为:

    "json":将响应评估为 JSON 并返回一个 JavaScript 对象。具有回调占位符的跨域“json”请求,例如?callback=? 使用 JSONP 执行,除非请求在其请求选项中包含 jsonp: false。 JSON数据被严格解析;任何格式错误的 JSON 都会被拒绝并引发解析错误。从 jQuery 1.9 开始,空响应也会被拒绝;服务器应该返回 null 或 {} 的响应。 (有关正确的 JSON 格式的更多信息,请参阅 json.org。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多