在 Sinatra 应用程序中访问实例变量
Accessing instance variables within a Sinatra application
这道题因为我原来写的方式不清楚所以改写了
如何获取 @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
index.erb
<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>
参数(结果)
{第一个 => "John",中间 => "Q",最后一个 => "Public"}
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的组件,你就会知道在url中?
之后可以传递查询参数,这就是[=17] =] 有效。
很高兴这个方法也适用于散列和数组参数,它们在 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"
@form_params 是您代码中的散列。像那样:
{"first" => "John", "middle" => "Q", "last" => "Public"}
。
实际上它是一个字符串,但可以转换为哈希。
当您将其附加到重定向 url 时,它会变成
/show_results?{"first" => "John", "middle" => "Q", "last" => "Public"}
和你的预期不一样。我猜你想要那样的东西 0
/show_results?first=john&middle=Q ...
你应该做的是,
获取参数并解析它。也许 sinatra 有一个内置的方法(更好看的文档),但这也可以用普通的 ruby 轻松完成。
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
除此之外,您为什么要发送 post 请求然后将其重定向到 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 块中,您可以轻松访问 params[:first]、params[:middle] 并使用它们。
这道题因为我原来写的方式不清楚所以改写了
如何获取 @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
index.erb
<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>
参数(结果)
{第一个 => "John",中间 => "Q",最后一个 => "Public"}
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的组件,你就会知道在url中?
之后可以传递查询参数,这就是[=17] =] 有效。
很高兴这个方法也适用于散列和数组参数,它们在 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"
@form_params 是您代码中的散列。像那样:
{"first" => "John", "middle" => "Q", "last" => "Public"}
。
实际上它是一个字符串,但可以转换为哈希。
当您将其附加到重定向 url 时,它会变成
/show_results?{"first" => "John", "middle" => "Q", "last" => "Public"}
和你的预期不一样。我猜你想要那样的东西 0
/show_results?first=john&middle=Q ...
你应该做的是,
获取参数并解析它。也许 sinatra 有一个内置的方法(更好看的文档),但这也可以用普通的 ruby 轻松完成。
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
除此之外,您为什么要发送 post 请求然后将其重定向到 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 块中,您可以轻松访问 params[:first]、params[:middle] 并使用它们。