如何使用Sinatra和Sequel从复选框HTML表单中获取数组?

时间:2012-09-29 00:45:49

标签: html ruby forms checkbox sinatra

这是我的表格:

<form action="/results" method="post" name="checkbox_form">
    <input type="checkbox" name="item" value="Bacon">Bacon (1 lb., sliced)<br>
    <input type="checkbox" name="item" value="Eggs (dozen)">Eggs (1 dozen)
    <input type="submit" value="Calculate">
</form>

如果用户同时检查“培根”和“鸡蛋(1打)”框,我如何使用Sinatra和/或Sequel返回此数组:

["Bacon","Eggs (dozen)"]

如您所见,数组元素是表单的'value'元素。

作为一个附带问题:Sinatra如何处理复选框表格?我在Sinatra手册中找不到任何好的信息。

1 个答案:

答案 0 :(得分:8)

您实际上不需要续集接收来自post请求的项目。续集是一个数据库,因此您可以在从post收到后将退回的项目保存到数据库中。因此,在这种情况下,您实际上并不需要它来返回数组。

此外,表单和复选框并非特定于Sinatra,但 特定于HTML。

当您将表单作为post请求提交时,会将其发送回服务器和可以处理它的Sinatra。 Sinatra提供了一个params方法,其中包含已提交表单值的哈希值。

在下面的示例中,我使用特殊语法(item[])将名为item的值作为params哈希中的数组提供。例如,这是params散列返回{"item"=>["Bacon", "Eggs (dozen)"]}并选中两个复选框的内容。

require 'sinatra'

get '/results' do
  erb :results
end
post '/results' do
   params[:item].inspect
end

__END__

@@ results
<form action="/results" method="post" name="checkbox_form">
    <input type="checkbox" name="item[]" value="Bacon">Bacon (1 lb., sliced)<br/>
    <input type="checkbox" name="item[]" value="Eggs (dozen)">Eggs (1 dozen)<br/>
    <input type="submit" value="Calculate"/>
</form>

get块从用户的浏览器接收get请求并处理它。在此示例中,它将HTML表单返回给用户。

post块在用户提交表单后收到来自用户浏览器的帖子请求。向用户显示来自服务器的响应,在这种情况下是一个复选框值的数组。