在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。