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