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