如何使用 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
变成一个哈希数组,也许—— - 我认为你可能在理解上有更多问题?)
我已经在下面的代码中卡了好几天了。任务是通过一页中的表单(可能超过一百行)更新数据库 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
变成一个哈希数组,也许—— - 我认为你可能在理解上有更多问题?)