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

问题描述:

我被困在下面的代码几天了。任务是通过一页中的表单(可能超过一百行)更新数据库表中的多行。我搜索了网页,并学习了如何使用'[]'从这个博客获取表单中的数组:http://www.randomsnippets.com/2008/02/21/how-to-dynamically-add-form-elements-via-javascript/,但我的问题是我不知道如何将数组传递给我的ruby代码。任何人都可以帮我吗?谢谢! 这里是主要的红宝石文件(main.rb的):如何使用Sinatra和Datamapper将数组从数据库传递到数据库?

require 'sinatra' 
require 'data_mapper' 

DataMapper.setup(:default, 'mysql://user:[email protected]/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]或其他缺失时,循环停止。 (注意:这不是一个非常糟糕的解决问题的方式,我可能会使用更短的自己 - 将params变成一个哈希数组,也许 - 我认为你可能会拥有这些哈希数组。更多的理解问题?)

+0

谢谢安迪!真的行!实际上,我将在包含100个算术问题的练习页面中使用代码。我认为这是一个简单的方法。 –