比较项目的 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 结构的主要内容,如果未能解决你的问题,请参考以下文章

01_Django-介绍-项目结构-URL和视图函数

01_Django-介绍-项目结构-URL和视图函数

01_Django-介绍-项目结构-URL和视图函数

如何将 URL 与 PHP 项目的目录结构映射 [重复]

比较具有忽略项目顺序的切片字段的结构与stretchr/testify

项目管理组织结构四种类型的比较