Wednesday, April 1, 2009

知道Rails中的routes.rb怎么使用了

Rails利用routes.rb中的配置来将一个http请求映射到相应的controller的action中。在config目录下的routes.rb文件中有大量的注释,有助于理解映射的原理。

首先要注意到 :controller 和 :action 是关键的参数,它们俩决定了调用的controller以及相应的action,所以必须要给出这两个参数的值。那么怎么给出它们的值呢?有两个方法:

1 在map的地址模板中给出

最标准的实例就是 map.connect ':controller/:action' 了,这就是说把http request中的两个部分截取下来,作为controller和action名字。比如 localhost:3000/user/show_all 就是对应了User这个Controller的show_all方法。

我们还可以加入其他的信息,比如 map.connect ':controller/:action/:id',这就是说把http request中的第三部分截取下来,作为一个名为“id”的参数,传递给调用的方法。在ruby代码中,可以用param[:id]获取到这个参数的值。

如果 :id 参数包含一些特殊字符,例如‘.’(period)的时候,默认的映射就会失败。这就需要稍微增加一些辅助信息给ruby了。我对于这些带冒号开头的URL片段的理解是,它们就是一些正则表达式,而默认的正则表达式不能很好的识别诸如period这样的字符,于是需要自己重新设定一下正则表达式:

map.connect ':controller/:action/:id', :id=> /[a-zA-Z0-9._@]+/

这样以来,如下的http请求也能被很好的处理了:

localhost:3000/user/add/someone@some.com

2 直接指定Controller以及Action

routes.rb中的注释代码很好的给出了范例:

map.connect 'products/:id', :controller=>'catalog', :action => 'view'

当用户给出一个http请求到 products/some_product 的时候,ruby on rails会调用 Catalog的view方法来进行处理,而 param[:id] 则包含了 "some_product" 这个信息。

0 comments: