这个问题已被重写,因为我最初编写它的方式尚不清楚。
如何获取@form_params
中的值并将其传递给get '/show_results'
?
class MyApp < Sinatra::Base
configure :development do
register Sinatra::Reloader
end
get '/' do
erb :index
end
post '/form_handler' do
@form_params = params
redirect to("/show_results/?#{@form_params}")
end
get '/show_results' do
erb :display_result
end
end
<form method="POST" action="/form_handler">
...
<input type="hidden" name="first" value="John">
<input type="hidden" name="middle" value="Q">
<input type="hidden" name="last" value="Public">
...
</form>
{first =&gt; &#34; John&#34;,middle =&gt; &#34; Q&#34;,last =&gt; &#34;公共&#34;}
答案 0 :(得分:1)
params
对象是每个请求。重定向时,除非您使用url明确传递它们,否则它们将丢失。顺便说一下,您可以使用sessions
,它将数据作为cookie传递,但可以配置为使用数据库。
如果你require 'active_support/all'
redirect to("/show_name?#{my_hash.to_param}"):
在ActiveSupport(与Rails捆绑,而不是Sinatra)中,Hash#to_param方法的工作原理如下:
hash = { a: 1, b: 2 }
hash.to_param
# => "a=1&b=2"
如果您已了解URL的组件,您将知道查询参数可以在网址中的?
之后传递,这就是"/show_name?#{my_hash.to_param}"
的工作方式。
很好,这个方法也适用于散列和数组参数,它使用url中的特殊语法,即/path?my_list[]=1&my_list[]=2
使param[:my_list] == ['1','2']
。
除了在某些情况下,&
[
]
字符需要转义(替换为特殊字符序列)。
puts ({a: 1, b: [1,2]}.to_param)
# => a=1B%5D=1&b%5B%5D=2
URI.unescape CGI.unescape({a: 1, b: [1,2,3]}.to_param)
# => "a=1&b[]=1&b[]=2&b[]=3"
答案 1 :(得分:1)
@form_params是代码中的哈希值。那样的:
{"first" => "John", "middle" => "Q", "last" => "Public"}
。
实际上它是一个字符串,但可以转换为哈希。
当你将它添加到重定向网址时,它变为,
/show_results?{"first" => "John", "middle" => "Q", "last" => "Public"}
它与您的期望不同。因为我猜你想要那样的东西0
/show_results?first=john&middle=Q ...
你应该做的是,
使用params并解析它。也许sinatra有一个内置的方法(更好看的文档),但这也可以很容易地用普通的红宝石完成。
post '/form_handler' do
redirect_url = '/show_results'
params.each { |k,v| redirect_url += "?#{k}=#{v}" }
#don't worry about above line, the rest of ?-s will be converted into &
redirect to(redirect_url)
end
除了所有这些之外,为什么要发送帖子请求然后将其重定向到get块?
如果您使用get提交表单,它将自动解析为
url?k1=v1&k2=v2 ..
我是说这个。
<强> index.erb 强>
<form method="get" action="/form_handler">
<input type="text" name="first" value="John">
<input type="text" name="middle" value="Q">
<input type="text" name="last" value="Public">
<input type="submit" name="ok">
</form>
主档。
get '/' do
erb :index
end
get '/form_handler' do
erb :display_result
end
然后在你的display_result文件中,或者在get block中,你可以轻松访问params [:first],params [:middle]并使用它们。