【问题标题】:Rails 3 Route with Multiple Optional Parameters带有多个可选参数的 Rails 3 路由
【发布时间】:2015-06-12 15:02:44
【问题描述】:

我正在尝试创建一个具有可选参数以及不同顺序的 Rails 路由。

这个问题描述了一个类似的问题:Routes with multiple, optional, and pretty parameters

我正在尝试创建其中包含地图过滤器的路线,例如参数,但没有参数 URL 样式。我们的想法是让它们看起来像

/search/country/:country/
/search/country/:country/state/:state/
/search/country/:country/state/:state/loc/:lat/:long/

但你也应该能够搜索

/search/state/:state/
/search/state/:state/country/:country/
/search/loc/:lat/:long/

我知道我可以使用路由通配符编写复杂的正则表达式语句 - 但是我想知道是否有办法让多个可选路由参数具有未指定的顺序,例如

/search/( (/country/:country)(/state/:state)(/loc/:lat/:long) )

谢谢!

【问题讨论】:

  • 我认为您已经有了解决问题的最佳方法,即正则表达式
  • 另一种方法,也许不是最好的方法,就是在你的routes.rb中包含多个条目
  • 我使用 Regex 来解决这个问题,但我仍然很好奇 Rails5 协议是否希望支持多个可选参数。您应该能够指定分隔符并在显式和未排序之间进行选择。
  • @RPinel 是的,这是一个解决方案,但它并不可行,因为 N 个参数对应于 N 个参数!路由文档中的路由数量。在那种情况下,Regex 将是一个明显的选择!

标签: ruby-on-rails routing


【解决方案1】:

您可以使用 constraints 和 lambda 来使用多个搜索选项:

  search_options = %w(country state loc)
  get('search/*path',:to => 'people#search', constraints: lambda do |request|
             extra_params = request.params[:path].split('/').each_slice(2).to_h
             request.params.merge! extra_params # if you want to add search options to params, you can also merge it with search hash
             (extra_params.keys - search_options).empty?
           end)

您可以为更复杂的路线制作不同的 lambda

【讨论】:

  • 谢谢,这似乎是解决问题的好方法。我想最终归结为像你说的那样复杂的 lambda 中的正则表达式,希望他们会在 Rails 5 中添加简单的多个可选参数支持!
猜你喜欢
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2015-02-25
  • 2016-10-12
  • 2011-01-09
相关资源
最近更新 更多