繁体   English   中英

在使用范围和CanCan的多功能时,如何进行RESTful深度链接

[英]How to do RESTful deep linking when using multi-tenency with scopes and CanCan

背景

我的应用程序正在使用Multi-Tenency With Scopes ,这基本上意味着我的许多模型使用default_scope将current_tenant.id与tenant_id列进行比较,以确定current_user是否有权访问该对象。

我也在使用CanCan进行授权。

问题:如何为尚未登录应用程序的用户深层链接到特定对象?

一般用例

我希望能够通过电子邮件发送给用户并说:“此任务已分配给您。点击此处查看任务。” 然后,用户可以单击链接(例如, http//myapp.com/task/15 ),如果他们已经登录到相应的租户(该任务所属的),则直接进入该任务。 或者,如果他们没有登录,他们将被重定向到登录页面,并显示“请登录以访问此页面”的消息。

例子

首先,一个行为与我期望的一样的例子:

如果用户注销并转到http://myapp.com/tasks ,则CanCan会检查“Guest”用户是否有权转到Tasks#index。 访客未被授权这样做,因此CanCan引发了一个异常,我通过记录目标路径并重定向到登录页面并输入“请登录以访问此页面”来处理该异常。

这是一个令我难过的例子:

用户已注销并单击指向http://myapp.com/tasks/15的链接。 用户将总是得到404(未找到)错误,因为Rails做的第一件事是尝试找到该特定对象。 但是由于用户已注销(意味着未定义current_tenant),并且该任务是针对tenant_id == 5,因此Rails无法找到该对象并引发异常。

这是完整的调试/堆栈跟踪:

INFO -- : Started GET "/tasks/15" for 127.0.0.1 at 2014-12-14 11:16:59 -0500
INFO -- : Processing by TasksController#show as HTML
INFO -- :   Parameters: {"id"=>"15"}
DEBUG -- :   Task Load (0.8ms)  SELECT  "tasks".* FROM "tasks"  WHERE "tasks"."tenant_id" IS NULL AND "tasks"."id" = $1 LIMIT 1  [["id", 15]]
INFO -- : Completed 404 Not Found in 4ms
FATAL -- : 
ActiveRecord::RecordNotFound (Couldn't find Task with 'id'=15 [WHERE "tasks"."tenant_id" IS NULL]):
app/controllers/application_controller.rb:46:in `scope_current_tenant'

这是application_controller的'scope_current_tenant'方法:

def scope_current_tenant
  Tenant.current_id = current_tenant.id if current_tenant
  yield
ensure
  Tenant.current_id = nil
end

我喜欢发生的事情与用户在注销时尝试访问Tasks#index时发生的情况相同。

任何想法如何处理这个?

听起来您需要在尝试查找任务之前验证用户是否已登录。 你有一个before_action :authenticate_user! 你的TasksController类似的TasksController

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM