在 Ruby on Rails 中支持 /similar-to-:product 之类的 URL?
Posted
技术标签:
【中文标题】在 Ruby on Rails 中支持 /similar-to-:product 之类的 URL?【英文标题】:Supporting URLs like /similar-to-:product in Ruby on Rails? 【发布时间】:2010-09-12 08:30:38 【问题描述】:我一直在尝试使用 routes.rb 为我的网站创建 URL /similar-to-:product(其中产品是动态的)。问题是 routes.rb 很容易支持 /:product-similar 之类的 URL,但不支持前者,因为它要求 :product 前面有分隔符('/' 是分隔符,但 '-' 不是)。分隔符列表在 ActionController::Routing::SEPARATORS 中。
我不能添加“-”作为分隔符,因为 :product 也可以包含连字符。支持这样的 URL 的最佳方式是什么?
我成功尝试过的一种方法是不使用 routes.rb 并将 URL 解析逻辑放在控制器本身中,但这不是最干净的方法。
【问题讨论】:
【参考方案1】:我会重构您的网址,使它们只是“类似于/产品”
【讨论】:
【参考方案2】:其实你可以添加-
作为分隔符,然后使用路由通配符。
map.similar_product '/similar-to-*product', :controller => 'products', :action => 'similar'
然后,在 ProductsController#similar
@product = Product.find_by_slug params[:product].join('-')
尽管重构看起来确实更好,因为使用这种方法,您需要专门处理所有可以包含连字符的 slug。
【讨论】:
那行不通。 url 根本不匹配此路由。我想这是因为即使在这种情况下 *products 也应该在分隔符之后。【参考方案3】:一个简单的解决方案是使用routing filter。有关详细信息,请参阅自述文件。
使用路由过滤器,您可以拥有一个 url /similar-to-:product
,在进行路由识别之前将其预处理为 /similar-to/:product
。您还需要对从/similar-to/:product
到/similat-to-:product
的生成路径进行后处理。
【讨论】:
【参考方案4】:我有点困惑,但您可以添加“to-”作为分隔符吗?
【讨论】:
好像rails只支持单个字符作为分隔符以上是关于在 Ruby on Rails 中支持 /similar-to-:product 之类的 URL?的主要内容,如果未能解决你的问题,请参考以下文章
在 Ruby on Rails 3.2+ 中流式传输部分视图
在 Spree 支持的 Ruby on Rails 电子商务应用程序中集成印度支付网关 (CCAvenue)
ruby Ruby on Rails指南:主动支持核心扩展 - http://guides.rubyonrails.org/active_support_core_extensions.html
如何解决 ruby on rails 版本差异(向后/向前兼容性)
Heroku上的现有Ruby on Rails Web应用程序(PostgreSQL),Devise身份验证,需要为移动支持添加Rails API