![](/img/trans.png)
[英]Will I regret using Devise for this? RoR, multiple user/admin layers, multi-tenency, fast user switching
[英]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.