2016-04-07 74 views
1

我被困在下面的代碼幾天了。任務是通過一頁中的表單(可能超過一百行)更新數據庫表中的多行。我搜索了網頁,並學習瞭如何使用'[]'從這個博客獲取表單中的數組: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> 

回答

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變成一個哈希數組,也許 - 我認爲你可能會擁有這些哈希數組。更多的理解問題?)

+0

謝謝安迪!真的行!實際上,我將在包含100個算術問題的練習頁面中使用代碼。我認爲這是一個簡單的方法。 –

相關問題