比较项目的 URL 结构
Posted
技术标签:
【中文标题】比较项目的 URL 结构【英文标题】:URL Structure for Comparing Items 【发布时间】:2021-11-05 14:12:27 【问题描述】:构建用于比较多个项目的路径的最佳方法是什么?
这是网址示例:https://versus.com/en/microsoft-teams-vs-slack-vs-somalia
如何在 routes.rb 文件中实现这一点?在互联网上真的找不到任何关于红宝石的东西。我唯一能想到的是带有可选参数的 url,但是如果参数的数量是无限的呢?
【问题讨论】:
【参考方案1】:您将不得不自己解析a-vs-b-vs-c
。
所以在 routes.rb 中,你会有类似的东西:
get 'compare/:compare_string', to 'compare#show'
然后你会得到一个你必须解析的参数compare_string
:
#in compare_controller.rb
def show
compare_items = params[:compare_string].split('-vs-')
# generate the comparison from the compare_items array
end
【讨论】:
我认为这是有道理的。感谢您的反馈!我会试试的!【参考方案2】:首先 - 在实践中,您可能不应该允许无限 # 的参数。即使像 100 这样的值也可能会破坏您的页面和/或导致性能问题,并使您面临 DOS 攻击。我会选择某种合理/实用的限制并记录/执行它(例如 10、12 或任何对您的应用程序有意义的)。在大约 2k 个字符时,您将开始遇到 URL-length issues。
下一步 - URL 是否有任何灵活性?名称往往会发生变化,因此如果您希望 URL 随时间推移而工作,您需要对它们中的每一个进行 slug-ify(使用 friendly-id 之类的东西),以便您可以跟踪随时间的变化。例如 - 您可以使用不可变/唯一的 ID 和人类可读的名称吗?
无论如何,Rails 为 URL 路由提供了一个非常灵活的系统。您可以通过Rails routing documentation 阅读有关各种选项/配置的更多信息。
默认情况下,Dynamic Segment 支持示例中的文本,因此(取决于您的控制器名称)您可以执行以下操作:
get 'en/:items', to: 'items#compare'
如果有帮助,您可以添加自定义 constraint
正则表达式以确保参数看起来像您期望的那样(例如 word-with-dashes-vs-another-vs-something-else
)
get 'en/:items', to: 'items#compare', constraints: items: /(?:(?:[A-Z-]+)vs)+(?:[A-Z-]+)/
然后,在您的控制器中,您可以根据需要解析出单独的字符串。有点像...
def compare
items = params[:items].split('-vs-')
end
【讨论】:
以上是关于比较项目的 URL 结构的主要内容,如果未能解决你的问题,请参考以下文章