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