最近在做一个权限系统,所以要抽象权限,我个人的抽象是,整个系统由资源组成,任意一个资源最多只支持 CURD 四种操作,注意这里每个 资源只支持一种查看方式,如果理解的没错,这就是 RESTfull 的精髓。如果这样对系统进行抽象,则权限控制系统就很好实现,就是设置对 资源允许哪些操作。很自然的,我想到来 Rails 路由中就有'资源这种概念' Controller 则包含一组资源的所有操作。但是仔细一想会有个问题, 也是我觉得 Rails 和 Restfull 不一致的地方,比如 在路由中定义了一个 resoures books. 我们发现不仅能对单个 book 进行操作也能对多个 book 进行操作 (index action), 其实个人认为这样本质上其实定义了两个 resoures, 一个是对单个 book 的 CRUD 操作,一个是多个 book 的支持 show 操作. 可能有同学会说,查看一个 book,是查看多个 book 的一种特例。这样想看上去没错,但是有一个细节,当你只有权限查看一个 book 时,你是没有权限执行 查看多个 book 的行为的,也就是说你能不能一个查看多个 book,和你能不能查看一个 book 在面向资源的模式中是完全不同的两个操作. 最后我个人觉得应该这样写
resource book
resources books , only:[;index]
这两句等价与 resources book, 不过这不是蛋疼,这样写更清晰 (其实把对 books 资源的 show,叫做 index 不是很好,也应该称作 show) 使用这种方式,有一个问题就是对用户不友好比如登录,把登录登出实现为对 user_session 资源的 create, destory 操作
resource user_sesson, only:[:create, :destroy]
这样生成的 URL 是 user_sesson, 但是这里使用 user_sesson 作为 URL 并不友好,我们希望是 user_signin, 对于这个需求其实和 Rails 的 路由的 helper 很像
resource user_session, only:[:create, :destroy], as: user_signin
这样我们可以在 Rails 中使用 create_user_signin_path,来代表 user_session, 同理我们只需要把/user_signin 映射到 user_session 就可以解决 问题了,使用 path 这个参数杠杠的
resource user_session, only:[:create, :destroy], as: :user_signin, path: :user_signin
这样我们就可以使用更加友好的 /user_signin 来访问 user_session 资源, 最好有没有什么办法,只用我设定 as,参数,则 path 参数自动和 as 相同?
就拿登录来说,作为一个较高层面的思考,登录根本不应该和资源扯上关系,等多跟'who'有关,而这就是典型的 OO 模式. 个人认为以目前的情况,只使用 GET/POST 两种方式,但是这两种方式只是传参的方式不同,并没有语义上的差别, URL 既不作为对象也不作为 action, 而是单纯的访问入口,对象和操作,在参数中传递,当然这种模式可以很自然的退化成 Restfull 也就是说是完全兼容 Restfull 的 最后,写的不一定对,欢迎大家吐槽