小背景信息:我有一个项目经过身份验证的用户可以拥有多个范围'数据的。范围确定用户可以访问哪些记录,哪些记录不能被用户访问。登录用户始终被存储在会话中存储的单个范围内。
用户可以随时在他有权访问的范围之间切换,无论他在哪个页面上。
在范围切换后,我想尝试使用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
。
现在再一次,这是一个例子,我的应用程序中存在许多这样的结构,所以我最好不要手动编辑它。
答案 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