2011-04-19 72 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

如果任何人有任何其他方式做到这一点,会更好,我会很感激的输入! :)