2011-04-19 53 views
1

在自學中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

如果任何人有任何其他方式做到這一點,會更好,我會很感激的輸入! :)

+0

太長時間閱讀,所以請將其縮小爲一個更簡短的問題。重點關注問題的小代碼示例,並對其進行清晰解釋。 – 2011-04-20 02:14:30

回答

1

這是我已經能夠想出最好的。

在我的配置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

如果任何人有任何其他方式做到這一點,會更好,我會很感激的輸入! :)