在Ruby on Rails中支持像/ like-to-:product这样的URL吗?

时间:2020-03-06 14:35:46  来源:igfitidea点击:

我一直在尝试使用route.rb为我的网站创建URL / like-to-:product(其中产品是动态的)。问题在于,routes.rb很容易支持/:product-like之类的URL,但不支持前者,因为它要求:product前面带有分隔符('/'是分隔符,而'-'不是)。分隔符列表在ActionController :: Routing :: SEPARATORS中。

我不能添加'-'作为分隔符,因为:product也可以包含连字符。支持这样的URL的最佳方法是什么?

我成功尝试的一种方法是不使用route.rb并将URL解析逻辑放入控制器本身,但这不是最干净的方法。

解决方案

我有些困惑,但是我们可以添加" to-"作为分隔符吗?

我会重构网址,以便它们只是"类似于/产品"

实际上,我们可以添加-作为分隔符,然后使用路由通配符。

map.similar_product '/similar-to-*product', :controller => 'products', :action => 'similar'

然后,在ProductsController#similar

@product = Product.find_by_slug params[:product].join('-')

尽管重构确实看起来更好,但是由于使用这种方法,我们将需要特别处理所有可能包含连字符的段。

一个简单的解决方案是使用路由筛选器。有关详细信息,请参见自述文件。

使用路由过滤器,我们可以拥有一个URL" / similar-to-:product",将其预处理为" / similar-to / :: product",然后再进行路由识别。我们还需要对生成的路径进行后处理,使其从/ similar-to /:product返回到/ similat-to-:product