显然这是 Datamapper 的一个问题(如果您认为它应该将字符串转换为 id 的数字),但 Sinatra 可以通过一些方法来缓解它。当参数进来时,您需要检查:
- 它们存在。
- 它们是正确的类型(或可铸造的)。
- 它们在所需或预期的值范围内。
例如:
get '/list/:id' do
r = Record.get(params[:id].to_i)
# more code…
curl http://example.org/list/ddd
这不会很好,最好检查并返回错误消息:
get '/list/:id' do |id| # the block syntax is helpful here
halt 400, "Supply an I.D. *number*" unless id =~ /\d+/
然后考虑您是否想要一个默认值,该值是否在正确的范围内等。在获取 ID 时,我倾向于使用路由的正则表达式语法,因为它也停止跟随被吞噬的子路由,同时提供一些简单的类型检查:
get %r{/list/(\d+)} do |id|
助手在这种情况下也很有用:
helpers do
# it's not required to take an argument,
# the params helper is accessible inside other helpers
# it's but easier to test, and (perhaps) philosophically better.
def id( ps )
if ps[:id]
ps[:id].to_i
else
# raise an error, halt, or redirect, or whatever!
end
end
end
get '/list/:id' do
r = Record.get id(params)