redirect_to:back抛出的救援异常

时间:2016-05-30 13:26:49

标签: ruby-on-rails

小背景信息:我有一个项目经过身份验证的用户可以拥有多个范围'数据的。范围确定用户可以访问哪些记录,哪些记录不能被用户访问。登录用户始终被存储在会话中存储的单个范围内。

用户可以随时在他有权访问的范围之间切换,无论他在哪个页面上。

在范围切换后,我想尝试使用redirect_to :back重新加载同一页面。这并不总是可行,因为当前范围可能不允许访问以前正在查看的页面。

在这些情况下,有问题的控制器会在ActiveRecord::RecordNotFound调用的相应控制器中抛出.find(params[:id])异常,这非常难看。我非常希望优雅地回退到redirect_to :root并附带警告信息。

目前我有这个,但这不起作用:

  def switch_scope
    s = current_client.scopes.find(params[:scope_id])
    set_scope(s.id)
    begin
      flash[:notice] = 'Scope switched succesfully.'
      redirect_to :back # <= This might throw NotFoundException
    rescue
      flash[:alert] = 'Scope switched. Page could not be reloaded'
      redirect_to :root
    end
  end

修改 例如,redirect_to :back可能会返回此节目产品功能:

def show
  @product = Product.where(scope_id: session[:scope_id]).find(params[:id])
end

如您所见,它首先根据会话中选定的范围过滤所有产品。然后它对该子集进行查找(ID)。在范围切换后,很可能无法再访问具有所述ID的产品,并提供RecordNotFoundException

现在再一次,这是一个例子,我的应用程序中存在许多这样的结构,所以我最好不要手动编辑它。

1 个答案:

答案 0 :(得分:-1)

application_controller.rb

中添加此内容
rescue_from ActiveRecord::RecordNotFound do |exception|
 if (params[:controller]=="your_controller_name" && params[:action] == "Your method")
  flash[:alert] = "Access denied. You are not authorized to access the requested page."
  redirect_to root_path
 end
end 

OR

def switch_scope
    s = current_client.scopes.find(params[:scope_id])
    set_scope(s.id)
    begin
      flash[:notice] = 'Scope switched succesfully.'
      redirect_to :back # <= This might throw NotFoundException
    rescue ActiveRecord::RecordNotFound => e
      flash[:alert] = 'Scope switched. Page could not be reloaded'
      redirect_to :root
    end
end