在自學中Sinatra我想製作一個web應用程序,通過ICMP監視設備並在瀏覽器中顯示結果。Sinatra的動態窗體
我有一個配置頁面,用戶可以決定他想要監視的設備數量以及這些設備的IP和說明。我希望表單是動態的,所以我可以輕鬆地遍歷變量。我不想預測用戶想要跟蹤的設備數量。我想要這樣的東西。
<form name="config" action="/config" method="post">
#of devices to check: <select name="numofdevices">
<% case $devices.to_i
when 1 %>
<option value=1 SELECTED>1</option>
<option value=2>2</option>
<option value=3>3</option>
<% when 2 %>
<option value=1>1</option>
<option value=2 SELECTED>2</option>
<option value=3>3</option>
<% when 3 %>
<option value=1>1</option>
<option value=2>2</option>
<option value=3 SELECTED>3</option>
<% end %>
</select> <br />
<% $devices.times do |devicenum| %>
Ip Address: <input type="text" name='<%= devicenum %>[ip]'> Description: <input type="text" name='<%= devicenum %>[desc]'><br />
<% end %>
顯然,這雖然不會因爲井號是在一個字符串的形式工作。我會通過
deviceOne = params[:"1"]
我無法遍歷這個
$numofdevices.times do |num|
devices[num] = params[:num.to_s]
end
訪問的變量主要是我想所有這些設備的投入到一個方便的數組。我不想爲用戶提前跟蹤的設備數量做好準備。我希望代碼能夠統計他們選擇的設備數量並相應地填充數組。
最終我想訪問像這樣的設備。在一組哈希中。
$devices[0][:ip]
然後我可以輕鬆地遍歷每個設備。
$devices.each do |device|
puts "IP: #{device[:ip]}, Desc: #{device[:desc]}"
end
這樣的事情來考慮
$numofdevices.times do |devicenum|
devices[devicenum] = params[:devicenum]
end
我肯定知道我做錯了什麼,而我的紅寶石哈希/陣列工作必須怎樣的知識有限。我希望有一個更好的方式,而不是以下。
<form name="config" action="/config" method="post">
#of devices to check: <select name="numofdevices">
<% case $devices.to_i
when 1 %>
<option value=1 SELECTED>1</option>
<option value=2>2</option>
<option value=3>3</option>
<% when 2 %>
<option value=1>1</option>
<option value=2 SELECTED>2</option>
<option value=3>3</option>
<% when 3 %>
<option value=1>1</option>
<option value=2>2</option>
<option value=3 SELECTED>3</option>
<% end %>
</select> <br />
<% case $devices.to_i
when 1 %>
Ip Address: <input type="text" name='firstd[ip]'> Description: <input type="text" name='firstd[desc]'><br />
<% when 2 %>
Ip Address: <input type="text" name='firstd[ip]'> Description: <input type="text" name='firstd[desc]'><br />
Ip Address: <input type="text" name='secondd[ip]'> Description: <input type="text" name='secondd[desc]'><br />
<% when 3 %>
Ip Address: <input type="text" name='firstd[ip]'> Description: <input type="text" name='firstd[desc]'><br />
Ip Address: <input type="text" name='secondd[ip]'> Description: <input type="text" name='secondd[desc]'><br />
Ip Address: <input type="text" name='thirdd[ip]'> Description: <input type="text" name='thirdd[desc]'><br />
<% when 4 %>
Ip Address: <input type="text" name='firstd[ip]'> Description: <input type="text" name='firstd[desc]'><br />
Ip Address: <input type="text" name='secondd[ip]'> Description: <input type="text" name='secondd[desc]'><br />
Ip Address: <input type="text" name='thirdd[ip]'> Description: <input type="text" name='thirdd[desc]'><br />
Ip Address: <input type="text" name='fourthd[ip]'> Description: <input type="text" name='fourthd[desc]'><br />
<% end %>
如果用戶決定使用那麼多設備,我將不得不預先創建設備變量以準備接受數據。我的路線看起來像這樣。
post '/config' do
@title = "Config"
$devices = params[:numofdevices].to_i
$firstdevice = params[:firstd]
$seconddevice = params[:secondd]
$thirddevice = params[:thirdd]
$fourthdevice = params[:fourthd]
erb :config
end
我確定我做錯了。如果我想跟蹤大量的設備,這會變得重複和繁瑣。我是一個學習新手。任何人都可以指出我正確的方向嗎? :)
[編輯]
我要去嘗試在我的帖子下面的 '/配置'
params.keys.each do |key|
@objects.push(params[key])
end
[編輯編輯]
這是我一直的最好能夠拿出來。
在我的配置ERB
<% $numofdevices.times do |id| %>
Ip Address: <input type="text" name='<%= id %>[ip]'> Description: <input type="text" name='<%= id %>[desc]'><br />
<% end %>
在我的職務「配置」
params.keys.each do |key|
$devices.push(params[key]) if params[key].include?("ip")
end
現在我不擔心什麼符號得到命名或他們是如何命名的。 :p
如果任何人有任何其他方式做到這一點,會更好,我會很感激的輸入! :)
太長時間閱讀,所以請將其縮小爲一個更簡短的問題。重點關注問題的小代碼示例,並對其進行清晰解釋。 – 2011-04-20 02:14:30