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