【问题标题】:Sinatra/Ruby default a parameterSinatra/Ruby 默认一个参数
【发布时间】:2013-02-18 11:01:45
【问题描述】:

有没有办法在 Sinatra 中默认参数?

我目前正在查看 'start' 是否作为参数传递,但这似乎有点 hacky。如果我可以告诉 Sinatra 如果未指定某些参数,那将是很好的。

get '/comments/?' do
   # want to setup page stuff, default to first page if not specified
   params[:start] = 0 if !params[:start] 
end

有什么想法吗?

【问题讨论】:

  • 除非你设置布尔值,否则我会使用||=

标签: ruby sinatra


【解决方案1】:

||=确实可以这样使用,但是在获取参数之后设置参数是一件很奇怪的事情。您更有可能从参数中设置变量。所以不要这样:

params[:start] ||= 0

你肯定更有可能这样做:

start = params[:start] || 0

如果你打算这样做,那么我建议使用fetch

start = params.fetch :start, 0

如果您真的在路由之前的参数哈希中寻找默认值,请使用before filter

before "/comments/?" do
  params[:start] ||= 0
end

更新:

如果你从路由模式中获取参数,那么你可以通过使用块参数给它一个默认参数,因为 Ruby(从 v1.9 开始)可以为块获取默认参数,例如

get "/comments/:start/?" do |start=0|
  # rest of code here
end

start 参数将通过start 局部变量(给块)或params[:captures].first(参见the docs for more on routes)提供。


进一步更新:

当您将路由传递给动词方法(例如get)时,Sinatra 将使用该路由来匹配传入请求。匹配的请求会触发给定的块,因此明确您想要一些默认值的简单方法是:

get "/comments/?" do
  defaults = {start: 10, finish: 20}
  params = defaults.merge params
  # more code follows…
end

如果您想让它看起来更干净,请使用帮助器:

helpers do
  def set_defaults( defaults={} )
    warn "Entering set_defaults"
    # stringify_keys!
    h = defaults.each_with_object({}) do |(k,v),h|
      h[k.to_s] = defaults[k]
    end
    params.merge!( h.merge params )
  end
end

get "/comments/?" do
  set_defaults start: 10, finish: 20
  # more code follows…
end

如果您需要更重量级的东西,请尝试sinatra-param


Sinatra::DefaultParameters 宝石

我非常喜欢这段代码I've turned it into a gem

【讨论】:

  • '但是在检索参数后设置参数是一件非常奇怪的事情',同意,这就是为什么我称它为“hacky”。我不确定前置过滤器是否更好。我真的很希望得到类似 get '/cmets[:start = 0]/?'或类似的东西。使用路由框架能够做到这一点似乎很常见。
  • 谢谢 iain,看起来是关于“路径”参数默认值但不是 url 参数默认值的想法,即 /cmets?status。在这一点上似乎没有完美的答案。
  • @forumuser 就我个人而言,我认为这种语法很难看,但每个人都有一种语法:) 不管怎样,'/comments[:start = 0]/?'would be an invalid url due to the slash at the end'/comments/?[:start = 0]' 不是更接近有效吗? (即便如此,方括号也是查询字符串的有效部分,因此将它们用作语法元素的整个想法似乎很愚蠢!)
  • 同意语法不是最优的,只是一个例子/想法。大多数 restful 语言/impls 都有默认路径和查询参数的想法。似乎Sinatra此时只能默认路径参数,而不是查询参数。
【解决方案2】:

您可以在此处使用“或等于”运算符:params[:start] ||= 0

http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

【讨论】:

  • 当然这是一个 Ruby 快捷方式,但与 Sinatra 检测到参数未在 url 上传递并默认它无关。
猜你喜欢
  • 2011-04-22
  • 2019-04-22
  • 2015-03-30
  • 2023-03-12
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2019-12-14
  • 2011-06-05
相关资源
最近更新 更多