如何使用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
变成一个哈希数组,也许 - 我认为你可能会拥有这些哈希数组。更多的理解问题?)
谢谢安迪!真的行!实际上,我将在包含100个算术问题的练习页面中使用代码。我认为这是一个简单的方法。 –