美文网首页程序员
Routing your rails,随心所欲创建routes

Routing your rails,随心所欲创建routes

作者: 刘思宁 | 来源:发表于2017-02-17 14:55 被阅读92次

故事是这样的,昨天听了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

  1. scope方法有三个键:as, path, module 分别改变Prefix, URI Pattern, Controller,其中path可以省略(只要放在scope后面第一个位置给出一个值)
  2. namespacescope三个键的集合,每个键的赋值都是给namespace方法传的那个值。

相关文章

网友评论

    本文标题:Routing your rails,随心所欲创建routes

    本文链接:https://www.haomeiwen.com/subject/rqqlwttx.html