【问题标题】:How can I pass on arrays from a form to a database with Sinatra and Datamapper?如何使用 Sinatra 和 Datamapper 将数组从表单传递到数据库?
【发布时间】:2016-07-28 10:50:49
【问题描述】:

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

【问题讨论】:

    标签: mysql arrays forms sinatra datamapper


    【解决方案1】:

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

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

    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 转换为哈希数组,也许——我认为你可能会这样做,理解有更多问题?)

    【讨论】:

    • 谢谢安迪!真的行!事实上,我将在一个包含 100 个算术问题的练习页面中使用该代码。我认为这是一种简单的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多