以MVC的思维方式来理解Ruby on Rails框架的设计结构
在rails中,发送一个请求(/users)的处理全过程如下:
1)、浏览器发送请求(/users)
2)、Rails的routes会把请求路由给users_controller的index方法
3)、users_controller回调用UserModel获取所有的user
4)、UserModel会从数据库中把所有的user读取出来,
5)、UserModel把从数据库读取出来的所有user封装为List返回给user_controller
6)、user_controlle把UserModel返回userlist赋值给实例变量@users,该变量会传递给indexview
7)、indexview接收传递过来的@users,并通过内嵌的ruby把view渲染为HTML
8)、user_controller把渲染好的页面返回给浏览器
不同的请求处理过程基本上一样,除了路由策略,即调用不一样的controller,或者controller的不同方法,具体的调用策略由RailsRouter决定。
RailsRouter
Rails中的针对Resource的路由策略完全遵守REST的设计风格,即URL只是负责定位资源,对资源的操作通过原生的HTTPMethod类型来决定,只需要在routes.rb中配置上resources:users,就可以得到如下的一系列路由策略:
HTTPrequestURIActionPurpose GET/usersindexpagetolistallusers GET/users/1showpagetoshowuserwithid1 GET/users/newnewpagetomakeanewuser POST/userscreatecreateanewuser GET/users/1/editeditpagetoedituserwithid1 PUT/users/1updateupdateuserwithid1 DELETE/users/1destroydeleteuserwithid1
当然,除了REST风格的各种routes,Rails还支持各种定制的routes规则,方法如下:在routes.rb中加上语句
match'user/create'=>'users#new',:via=>:get
该规则匹配的是浏览器浏览/user/create,Rails会将请求路由到users_controller的new方法上,其他的处理都和/users/new一样。不过要注意的是,Rails会使用第一个匹配上的规则,如果我们把上面的那条route语句改为
match'users/create'=>'users#new',:via=>:get
,其就不会按我们设想的工作了,其会匹配到到规则
GET/users/1showpagetoshowuserwithid1
,
即获取id为created的user。