如何使用 Sinatra 和 Datamapper 将数组从表单传递到数据库?

How can I pass on arrays from a form to a database with Sinatra and Datamapper?

我已经在下面的代码中卡了好几天了。任务是通过一页中的表单(可能超过一百行)更新数据库 table 中的多行。我已经在网上搜索并学习了如何使用“[]”从这个博客中获取数组形式:http://www.randomsnippets.com/2008/02/21/how-to-dynamically-add-form-elements-via-javascript/,但我的问题是我不知道如何将数组传递给我的 ruby代码。谁能帮帮我?谢谢! 这是主要的 ruby 文件(main.rb):

require 'sinatra'
require 'data_mapper'

DataMapper.setup(:default, 'mysql://user:password@hostname/database')

class Check
  include DataMapper::Resource
  property :id, Serial
  property :answer, String
end

DataMapper.finalize.auto_upgrade!

get '/' do
  @checks = Check.all :order => :id.asc,  :limit => 5
  erb :home
end

put '/update' do
  n        = Check.get  params[:id1]
  n.answer = params[:answer1]
  n.save

  n        = Check.get  params[:id2]
  n.answer = params[:answer2]
  n.save

  n        = Check.get  params[:id3]
  n.answer = params[:answer3]
  n.save

  n        = Check.get  params[:id4]
  n.answer = params[:answer4]
  n.save

  n        = Check.get  params[:id5]
  n.answer = params[:answer5]
  n.save

  redirect '/'
end

这是位于 views 目录中的嵌入 home.erb 文件:

<% i=0 %>
<form action="/update" method="post" id="edit">
  <% @checks.each do |check| %>
    <%= check.id %>
    <%  i = i + 1 %>
    <input type="hidden" name="_method" value="put">
    <input type="hidden" name="id<%= i %>" value="<%= check.id %>" />
    <input type="text" name="answer<%= i %>" value="<%= check.answer %>" />
    <p>
  <% end %>
  <input type="submit" value="update"></p>
</form>

数组样式home.erb大概是这样的:

<form action="/update" method="post" id="edit">
  <% @checks.each do |check| %>
    <input type="hidden" name="_method" value="put">
    <input type="hidden" name="myid[]" value="<%= check.id %>" />
    <input type="text" name="myanswer[]" value="<%= check.answer %>" />
    <p>
  <% end %>
  <input type="submit" value="update"></p>
</form>

您可能看错了。您不会经常在包含数百行的网页上看到表单,因此也许需要重新考虑您的用户界面 —— 以帮助您和用户。

话虽如此,我认为您可以利用现有的资源进行工作。你已经完成了大部分工作。只需更改路线代码,使其看起来像这样?

put '/update' do
  i = 1
  while params["id#{i}".to_sym]
    id     = "id#{i}".to_sym
    answer = "answer#{i}".to_sym

    n        = Check.get params[id]
    n.answer = params[answer]
    n.save

    i += 1
  end

  redirect '/'
end

我们现在在循环中构造它们,而不是硬编码 :id1:answer1 等。当缺少 params[:id432] 或任何内容时,循环停止。

(注意:这不是一种非常 Ruby 的解决问题的方法。我自己可能会使用更短的东西——将 params 变成一个哈希数组,也许—— - 我认为你可能在理解上有更多问题?)