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

时间:2016-04-07 13:47:58

标签: mysql arrays forms sinatra datamapper

我已经被困在下面的代码中好几天了。任务是通过一个页面中的表单(可能超过一百行)更新数据库表中的多个行。我在网上搜索并学习了如何使用'[]'从这个博客中获取表格中的数组: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

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

<% 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>

1 个答案:

答案 0 :(得分:0)

你可能以错误的方式看待这个问题。您不经常在包含数百行的网页上看到表单,因此可能需要重新考虑您的用户界面 - 以帮助您和用户。

话虽如此,我认为你可以使用你所拥有的东西。你完成了大部分工作。只需更改路线代码,使其看起来像这样?

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]或其他任何内容丢失时,循环停止。

(注意:这不是解决这个问题的非常好的方式。我可能会使用更短的东西 - 将params变成一个哈希数组,也许 - 你可以,我想,理解会有更多问题吗?)