【问题标题】:URL Structure for Comparing Items比较项目的 URL 结构
【发布时间】:2021-11-05 14:12:27
【问题描述】:

构建用于比较多个项目的路径的最佳方法是什么?

这是网址示例:https://versus.com/en/microsoft-teams-vs-slack-vs-somalia

如何在 routes.rb 文件中实现这一点?在互联网上真的找不到任何关于红宝石的东西。我唯一能想到的是带有可选参数的 url,但是如果参数的数量是无限的呢?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-5


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2019-09-12
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      相关资源
      最近更新 更多