我学到/推断出以下内容:
Guardian确实是封装了 “用户被允许做什么?” 的东西(一个Guardian实例也有一个User实例。)- 因此,权限谓词的正确位置就是
Guardian上的一个方法(lib/guardian.rb)。- 如果该方法是“用户能否对 Xxxx 对象执行 Z 操作?”,那么它可能属于
XxxxGuardianmixin 文件之一(lib/guardian/...)。 - 否则,它就属于基础
Guardian定义。
- 如果该方法是“用户能否对 Xxxx 对象执行 Z 操作?”,那么它可能属于
ApplicationController管理一个反映当前请求/客户端的guardian属性,并将其作为scope提供给序列化器,因此当前的Guardian在需要时可用(除非它不可用[1])。- 有些地方没有现成的
Guardian,通常是在系统运行的后端任务中,但如果你有一个“正在操作的用户”的句柄(例如,收件用户,在生成电子邮件通知时),你可以即时创建一个合适的 guardian:Guardian.new(the_user)。