访问Sinatra应用程序中的实例变量

时间:2017-01-07 02:15:20

标签: ruby sinatra parameter-passing

这个问题已被重写,因为我最初编写它的方式尚不清楚。

如何获取@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>

params(结果)

{first =&gt; &#34; John&#34;,middle =&gt; &#34; Q&#34;,last =&gt; &#34;公共&#34;}

2 个答案:

答案 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]并使用它们。