在RESTful路由中获取基于“名称”的URL而不是基于id的URL

如果我为控制器“画廊”实现RESTful路由,如下所示:

map.resources :galleries 

默认情况下,此控制器的show url为:

 /galleries/:id 

这会响应对/ gallery / 1等的任何请求

如果我在数据库中有一个带有’name’属性并且值为’portraits’的库记录,该怎么办? 我可以这样做:

 /galleries/portraits 

而不是做

 /galleries/1 ? 

Gallery模型中,添加一个#to_param方法,该方法返回URL中所需的内容(在本例中为name )。 在您的控制器中,您仍然可以通过params[:id]访问该值,并且您可能必须使用Gallery#find_by_name而不是Gallery#find

只要您使用提供的帮助程序( gallery_path等),您的URL就应该很漂亮。

然后你必须考虑一下如果画廊名称不像URL那么友好,例如’Autumn / Fall2009#1’,你有正斜杠(将改变路由)和破折号(不会提交给服务器)如果没有编码)。 因此,在生成此类URL时,您将需要urlencoding。