【问题标题】:Several optional parameters in sinatra routesinatra 路由中的几个可选参数
【发布时间】:2014-03-17 19:30:43
【问题描述】:

我需要 Sinatra 路由以下列方式运行:

GET /list/20/10  # Get 20 items with offset 10
GET /list/20     # Get 20 items with default offset
GET /list        # Get default number of items with default offset

我明白,我可能会将值作为查询传递:

GET /list?limit=20&offset=10

但我想如上所述传递它们。我很确定有一种方法可以向 Sinatra/Padrino 解释我想做什么,但我目前完全被卡住了。我试过了:

get :list, :map => '/list', :with => [:limit, :offset] {} # 404 on /list
get :list, :map => '/list/*' { puts params[:splat] } # 404 on /list
get :list, :map => '/list/?:limit?/?:offset?' {} # 404 on /list
get :list, :map => '/list' { redirect url_for(:list, …) } # 302, not convenient for consumers

我应该如何注意到 Sinatra 参数可能是可选的?

不小心,

get %r{/list(/[^/]+)*} do
  # parse params[:captures]
end

有效,但看起来很傻。

【问题讨论】:

  • @UriAgassi 和 grepping regex 一样,我直接找更清晰的答案。
  • 我认为get "/comments/:start/?" do |start=0| 可以为您解决问题...

标签: ruby sinatra padrino


【解决方案1】:

这个最小的例子:

#!/usr/bin/env ruby
require 'sinatra'

get '/test/?:p1?/?:p2?' do
  "Hello #{params[:p1]}, #{params[:p2]}"
end

仅适用于 /test/test/a/test/a/b。我错过了你的问题吗?

【讨论】:

  • 哎呀......现在它对我来说就像一个魅力。看起来错误是诱发的。无论如何,谢谢。
  • 所以你需要两个?包围每个可选的命名参数?
  • 是的,关于可选参数的文档非常稀缺,但这就是它们的定义方式。使用问号可能是一个尴尬的决定,因为它可能会导致与用于查询字符串的问号混淆。
  • 可选参数不需要两个问号。问号表示前面的字符或参数是可选的。在这种情况下,它表明斜杠是可选的,并且参数是可选的。
  • @Jrgns 你是绝对正确的,文档确实可以解释问号的确切作用,我稍后会提交错误报告
【解决方案2】:

实际上,Sinatra 中的参数匹配是由Mustermann 完成的,根据文档,您有几个可用的匹配器。

在你拥有的 sinatra 中:

sinatra     /:slug(.:ext)?

因此,如果您需要可选参数,则需要将它们包装在 ()? 中,就像上面的示例一样,取自文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2020-04-20
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多