Rails 是不是我学习的姿势不对?Rails 路由我总是理解不好

ceclinux-github · 2018年03月06日 · 最后由 jasl 回复于 2018年03月12日 · 2010 次阅读

Rails 路由全解是这样写的

Rails 路由能够识别 URL 地址,并把它们分派给控制器动作或 Rack 应用进行处理。它还能生成路径和 URL 地址,从而避免在视图中硬编码字符串。

OK,说实话有点抽象。所以我的理解是,Rails 为了方便程序员,搞了route.rb是一个 DSL,这个 DSL 能够 1. 方便大量创建路由 2. 降低使用者的抽象成本

第一点是毫无疑问resources :photos会在应用中创建 7 个不同的路由,这些路由都会映射到 Photos 控制器上。写一行就干了这么多事,漂亮。

但是第二点我实在理解不能,请问scope是啥意思,concern是啥?collectionmember呢?还有match?这些单词在我看来都很“抽象”,不具体。我很难把这些单词和他们所创建的路由联系在一起,总是混淆。求指点。

写着写着就豁然开朗了😂

先看一遍,有需要的时候再回锅。

https://ruby-china.org/topics/34907这个帖子是我心病,一直没抽时间解决

scope 也好 collection member 也好,这些都是用来修改路由创建行为的。

比如 resources :photos 创建了 /photos/* 指向 PhotoController 的路由。 那么 scope '/my' do resources :photos end 就会创建 /my/photos/* 指向 PhotoController 的路由。

scope 这个函数改变了 do ... end 之间 resources 函数的行为。

再说他们的含义。scope 是包裹一块路由。比如刚开始你写了一个博客,于是有 /posts /photos/ 等等。然而随着网站发展壮大,你希望再加装一个论坛,于是论坛也有 /posts/ 等等,那不就冲突了吗?

于是 scope 出现了,他把一个子系统包裹在一个路径之下,用 scope '/blog' do ... end ,包裹成 /blog/posts/ 这样,然后论坛放在 /bbs/posts 下,就解决了。

其实就是这几个单词的英文含义

推荐一个视频看看

glz1992 回复

非常优秀的视频,讲解的很清楚。Rails 把路由解析成了 NFA(顺便帮我简单过了一遍编译器知识),然而和我的问题关联不是很大啊😂

另外可以善用 rake routes 命令打印你系统里的路由匹配列表。

我个人更提倡数据驱动编程,你输入的路由定义,最终会变成一组匹配规则,学习的过程中,不断的去观察最终生成的匹配规则,找到规律,就可以了。基于规律也可以达成一些特殊的用法。

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