故事是这样的,昨天听了ihower的课程直播,里面讲到routes,虽然我经常使用routes,但一直没有搞明白module中具体的作用,也不知道实现原理。听了i老师的直播,知道的至少还有path,as,可以让我用,而且他们的作用跟namespace有一定重叠。
今天我在写routes的时候,就按照i老师说的,试验了一下我没有用过的功能,但是path这个键并不像我记得的那样改变了path(rails routes 命令中第一列 prefix),所以我就google了一下,在 Rails Guides 里面看到了这样一个小节,把这些问题全部说了一遍,对,仅仅一个小节。
在讲清楚这几个routes中的设置方法之前,先给出一个总结:有一些方法是互相替换的,或者说,是同一种情况的两种不同写法。
scope 和 path
scope 和 path 就是这样一对可以互相替换的代码。他们都用在想要改变url,但是不改变controller,也不改变path helper的情况下。
scope 'account' do
resource 'avatar'
end
或者
resource 'avatar', path: 'account/avatar'
都会产生类似于这样的效果
更进一步,我认为上面第一段代码的完整写法其实是:
scope path: 'account' do
resources 'avatar'
end
他也能产生上图中的效果。或者说scope 和 后面我们提到的 namespace 是同级别的方法,而path是一个给scope方法的一个参数。
module
按照上面的理论(scope是一个方法,path是一个参数),module也可以被看做(或者本来就是)scope的一个参数。先看看使用方法
scope module: 'account' do
resources 'avatar'
end
或者
resources 'avatar', module: 'account'
他们都会产生如下效果
这里可以稍微多说一点的是,跟上面的相比,URI Pattern 那一列已经变回去了。现在只用controller那一列有变化。如果你把path和module这两个键都赋上值,那么uri 和 controller 就一起变。
as
as主要是来控制那个生成_path
或者_url
的helper。当你这样使用as:
resources 'avatar', as: 'picture'
routes会生成这样的Prefix
这样的改变,是直接把avatar这个资源的名字,改成了picture。Rails Guides中给出了另外一个例子:把一个意思不明确的path变成意思非常明确。
get ':username', to: 'sessions#destroy', as: :logout
这样的话,你就会得到一个叫做logout_path
的helper,一看就知道是在登出。
另外,你还也可以把as写在scope里面,同样是改变那个helper,但结果略有变化:
这样我们就集齐了scope里面,能改变routes效果的三个键:as
, module
, path
。
namespace
经i老师提醒,namespace可以看成是scope 里面三个键的三合一:as
, module
, path
。
也就是说,下面这两段代码可以是等价的。
namespace 'account' do
resources 'avatar'
end
scope path: 'account', as: 'account', module: 'account' do
resources 'avatar'
end
他们的结果都是:
Recall
-
scope
方法有三个键:as
,path
,module
分别改变Prefix, URI Pattern, Controller,其中path
可以省略(只要放在scope后面第一个位置给出一个值) -
namespace
是scope
三个键的集合,每个键的赋值都是给namespace方法传的那个值。
网友评论