使用 ruby 和 sinatra 保存来自 html 文本的所有用户条目

Save all user entries from html text built off a loop using ruby and sinatra

我正在创建一个显示 table 的网页。在每条记录的末尾还有四列,它们是用户可以输入数据的文本字段。当用户点击底部的提交按钮时,我想保存所有文本字段中的所有数据并将其添加到我的 table。如何保存所有文本字段的数据?这是我的代码。

<h1>Testing Table</h1>
<form action="/table/" method="POST">
<table>
<thead>
<tr>
 <% event_column.each do |header| %>
    <th>
      <%= header %>
    </th>
  <% end %>
</tr>
</thead>
<tbody>
<% events.each do |event| %>
  <tr>
  <% event = event.first(14) %>
  <% event.each do |key, value| %>
    <td>
    <%= value %>
    </td>
  <% end %>
    <td><input type="text" name="event_description"></td>
    <td><input type="text" name="event_type">
    <td><input type="text" name="event_class">
    <td><input type="text" name="issue_expert"></td>
  </tr>
<% end %>
</tbody>
</table>
<br/>
<input type="submit">
<% ActiveRecord::Base.clear_active_connections! %>
</form>

我明白我的问题。因为当我尝试在 POST 方法

中显示时,我使用相同的变量来写入所有用户输入的列
<td><%= params[:event_description] %></td>

它只会显示最后输入的值,因为它正在被重复使用。无论如何,当我点击提交时,我可以遍历所有 html 文本字段并保存所有数据吗?我被困在这里,四处搜寻。我了解如何保存最后一行的文本条目,但我不知道如何保存所有文本条目。我是 sinatra 的新手,所以我一定是在做一些根本性的错误。

默认情况下,当 Sinatra(使用 Rack)解析表单数据时,如果有任何重复的键,则使用最后一个键并覆盖其他键。但是,如果您使用以 [] 结尾的名称,那么 Sinatra 会创建一个包含所有具有该名称的条目的数组。

因此在您的情况下,您需要更改输入元素的名称:

<input type="text" name="event_description[]">

(其他人也一样)。请注意名称末尾的 []

现在当您提交表单时,params['event_description'] 将是一个数组,其中包含提交给 event_description 输入元素的所有项目。

Sinatra/Rack 查询解析实际上比这更复杂,因此您可以进一步处理您的表单。在你的循环中你可以做这样的事情:

<td><input type="text" name="events[][description]"></td>
<td><input type="text" name="events[][type]">
<td><input type="text" name="events[][class]">
<td><input type="text" name="events[][issue_expert]"></td>

现在,当您提交表单并对其进行解析时,params['events'] 将包含一个散列数组,每个散列包含键 descriptiontypeclassissue_expert。然后您可以遍历此数组并根据需要处理数据。您可能希望为每个散列添加一个隐藏的 id 输入,以确保每组数据都与正确的记录相关联(它可能看起来像 <input type=hidden name="events[][id]" value="<% event.id %>">)。