Ruby 西纳特拉和问号

Ruby 西纳特拉和问号,ruby,get,sinatra,params,Ruby,Get,Sinatra,Params,我需要用Sinatra制作一些类似的方法: http/:localhost:1234/add?字符串添加到 但当我这样宣布时: get "/add?:string_to_add" do ... end get '/submit' do name = params[:name] age = params[:age] # use name and age variables ... end get '/add' do string_to_add = request.query

我需要用Sinatra制作一些类似的方法:

http/:localhost:1234/add?字符串添加到

但当我这样宣布时:

get "/add?:string_to_add" do
...
end
get '/submit' do
  name = params[:name]
  age = params[:age]
  # use name and age variables
  ...
end
get '/add' do
  string_to_add = request.query_string
  ...
end
它没有看到要添加的
字符串
参数


我应该如何声明我的方法并使用此参数使其正常工作?

您应该将其声明为:

get "/add?:string_to_add?" do
...
end

在URL中,问号将部件与部件分开。查询部分通常由名称/值对组成,通常由web浏览器构建,以匹配用户在表单中输入的数据。例如,url可能看起来像:

http://example.com/submit?name=John&age=93
这里是
/submit
中的路径部分,查询部分是
name=John&age=93
,它指的是
name
键的值“John”,以及
age
键的值“93”

在Sinatra中,仅指定路径部分。然后,Sinatra解析查询,并使其中的数据在
params
对象中可用。在本例中,您可以执行以下操作:

get "/add?:string_to_add" do
...
end
get '/submit' do
  name = params[:name]
  age = params[:age]
  # use name and age variables
  ...
end
get '/add' do
  string_to_add = request.query_string
  ...
end
如果在定义Sinatra路由时使用
字符,则会使url的一部分成为可选的。在您使用的示例(
get”/add?:string_to_add“
)中,它实际上将匹配以
/ad
开头的任何url,然后可选地匹配另一个
d
,然后其他任何内容都将放入params散列的
:string_to_add
键中,查询部分将被单独解析。换句话说,问号使前面的
d
字符成为可选字符

如果希望在Sinatra中获取查询字符串的“原始”文本,可以使用。在您的示例中,类似如下所示:

get "/add?:string_to_add" do
...
end
get '/submit' do
  name = params[:name]
  age = params[:age]
  # use name and age variables
  ...
end
get '/add' do
  string_to_add = request.query_string
  ...
end

请注意,路由不包括
字符,只包括基本
/add

您看到了吗?当我需要“?”而不是“/”之前的“*”时,此解决方案不起作用