8--Rails路由2

上节课讲了一般路由以及更便捷的命名路由,但是其实这两种都不太常用,资源路由更加常用

删除上节课添加的一般路由和命名路由,只留下资源路由(最后一行代码)

这个就是资源路由,我们前面已经讲过了,它在生成7种资源的访问路径同时也帮我们生成了对应的命名路由,我们通过命令行查看比如index的路由是posts,show的路由是post,路由就是Prefix下面的那些

原来index视图文件代码如下:

edit_post_path(post)就是使用rails默认生成的命名路由edit_post,有了这个以后我们就不用再去给7种路由单独命名。

资源路由最常用是因为一般情况下rails帮我们自动生成的show啊index之类都已经足够我们用了。如上我们只需要一个微博资源posts就够了。如果我们还需要添加其他资源,比如用户资源,那么我们再加一个用户的资源路由也就够了,依然不需要添加额外的路由配置。大部分路由用资源路由就可以搞定。

有个问题,资源路由只包含7种常见的路由action,如果我们需要添加其他的路由action呢?讲这个之前,我们先讲讲action的类型, action分为两种比如控制器文件中,index、show、new、edit这些就是用来渲染视图的action,也就是知道action函数里的代码之后rails自动帮我们去渲染视图文件(不需要自己写代码去显示视图)。还有第二种action是只完成功能,不会渲染视图,比如create、update、destroy,这类往往在结尾有个重定向或者json返回的动作将请求转向其他的地方。比如create来说,在视图文件夹就没有对应的视图文件:

if @post.save
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.json { render :show, status: :created, location: @post }

这段代码就是将请求转交给show页面进行处理,我们现在只要知道这类只处理功能的action最后会把请求转交到会渲染视图的action上比如show。

当我们需要一个自定义的action,用来只显示最近的微博,我们可以这样做:

Action里面写不写任何代码,然后在posts视图文件夹下添加recent.html.erb文件

我们添加完控制器和视图之后,然后浏览器栏输入recent路由报错,因为找不到路由,如下那样输入浏览器会使用show这个action去执行,会以为recent是id号。我们还没配置recent这个路由的访问,所以要先配置,而recent是资源posts的七种路由之外我们自己拓展的路由,所以:

对资源路由进行拓展就是在后面加do end,里面加入的路由就是在资源路由基础上的拓展

加入拓展有如下两种:

第一种集合路由关键词是collection

get表明动作,后面接个字符串'recent'表明action名称,如下就表示了在posts资源路由下添加了recent这个集合路由拓展。

添加完成后,rails工程就能响应posts/recent这条url请求了,并且同时生成了对应的命名路由。

注意collection前面也有冒号,否则访问出错,错误可能是下面图片中任何一个:

加上冒号,浏览器输入recent路由就能正常访问了,说明成功添加了集合路由拓展:

如果有多条集合路由需要添加呢?改成下面形式在collection的块里面添加多个集合路由即可:

除了集合路由,还有一种路由拓展方式叫成员路由,关键词是member,如下

这时候member生成的路由信息就变了,变成,区别在于成员路由生成的url格式是附加了资源的id号的,也就是在recent动作中会通过url传进来一个id号参数。当你需要处理的内容与具体的某条记录有关的时候选择成员路由更合适,因为它传进来同时附带资源id号

 

posted @ 2016-02-16 17:40  SixEvilDragon  阅读(244)  评论(0编辑  收藏  举报