Rails 对 Rails 路由 Resources 方法以及 RESTfull 的一些想法

lilijreey · 2016年10月26日 · 最后由 adamshen 回复于 2016年10月26日 · 2509 次阅读

最近在做一个权限系统,所以要抽象权限,我个人的抽象是,整个系统由资源组成,任意一个资源最多只支持 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 相同?

又想了一下 Restful 的思考面太底层了,不利于大型应用的抽象,

就拿登录来说,作为一个较高层面的思考,登录根本不应该和资源扯上关系,等多跟'who'有关,而这就是典型的 OO 模式. 个人认为以目前的情况,只使用 GET/POST 两种方式,但是这两种方式只是传参的方式不同,并没有语义上的差别, URL 既不作为对象也不作为 action, 而是单纯的访问入口,对象和操作,在参数中传递,当然这种模式可以很自然的退化成 Restfull 也就是说是完全兼容 Restfull 的 最后,写的不一定对,欢迎大家吐槽

一个只是多个的一种特例,当数组元素为 1 时的特例。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号