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

lilijreey · 发布于 2016年10月26日 · 最后由 adamshen 回复于 2016年10月26日 · 439 次阅读
24996

最近在做一个权限系统, 所以要抽象权限, 我个人的抽象是, 整个系统由资源组成, 任意一个资源最多只支持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 条回复
20859
adamshen · #1 · 2016年10月26日

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

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