Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery Rails-当用户计划不足以执行操作时显示弹出窗口-不更改所有视图_Jquery_Ruby On Rails_Cancancan - Fatal编程技术网

Jquery Rails-当用户计划不足以执行操作时显示弹出窗口-不更改所有视图

Jquery Rails-当用户计划不足以执行操作时显示弹出窗口-不更改所有视图,jquery,ruby-on-rails,cancancan,Jquery,Ruby On Rails,Cancancan,我想根据用户订阅的计划限制功能,如果计划不足,则显示弹出窗口 这看起来很简单,但我的要求是在单个配置文件(可能是ability.rb)中声明操作和权限,而不是在视图中声明。因此,在视图中,我不必为每个链接或按钮设置条件 示例:用户单击一个链接,由于“计划不足”,该操作未经授权,然后rails发送一个标头或HTTP错误代码(可能需要HTTP 406升级)。 然后页面上的javascript捕获该错误并显示一个弹出窗口,告诉用户升级计划 Obs:它不同于简单的重定向。因为重定向会使用户离开原始页面

我想根据用户订阅的计划限制功能,如果计划不足,则显示弹出窗口

这看起来很简单,但我的要求是在单个配置文件(可能是ability.rb)中声明操作和权限,而不是在视图中声明。因此,在视图中,我不必为每个链接或按钮设置条件

示例:用户单击一个链接,由于“计划不足”,该操作未经授权,然后rails发送一个标头或HTTP错误代码(可能需要HTTP 406升级)。 然后页面上的javascript捕获该错误并显示一个弹出窗口,告诉用户升级计划

Obs:它不同于简单的重定向。因为重定向会使用户离开原始页面

这样的事情能实现吗

我不想对每个链接和按钮的视图使用条件

示例:


Obs:我正在使用cancancan进行授权和rails 5

Obs2:“计划不足”错误应与“未授权操作”错误不同

我四处搜索,没有找到一种方法来解决这个问题。
谢谢你的点灯

它需要在弹出窗口上吗? '因为如果没有,您可以在应用程序控制器上捕获来自cancan的被拒绝权限,并将用户重定向到另一个包含所需内容的页面。大概是这样的:

class ApplicationController < ActionController::Base

  rescue_from CanCan::AccessDenied do |exception|
    redirect_to your_page_url, :alert => exception.message
  end

end
这应该足以允许您针对计划不足或一般权限错误重定向


关于显示弹出窗口。。。Rails唯一能做的就是生成HTTP响应。您可以尝试进行AJAX(XHR)调用并返回JSON,客户机中的JavaScript将对其进行解释和响应。这样,您就可以完全控制浏览器中的操作。但这听起来不太好。

太好了!这就是我现在为我的用户所做的,当他们无法执行操作时。但“计划不足”错误的结果应与未经授权的行为不同。而且需要弹出窗口,因此没有正确计划的用户不会从页面中删除。你怎么认为!?关于以不同于一般未经授权错误的方式处理“计划不足”,我更新了关于该问题的答案。exception对象应该足以让您决定要做什么。但是为了显示弹出窗口,我真的不知道在那种情况下该怎么做…噢!我不知道。这是一个很好的办法。谢谢那么现在缺少的一部分就是让页面上的js知道这一点。我现在正在研究那个部分,并尝试做一个PoC。如果我发现了什么,我会告诉你的
  Rails.logger.debug "Access denied on #{exception.action} #{exception.subject.inspect}"