在自学Sinatra时,我想创建一个通过ICMP监控设备的Web应用程序,并在浏览器中显示结果。
我有一个配置页面,用户可以决定要监控的设备数量以及这些设备的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
我确信我做错了,而且我对ruby Hashes /数组如何工作的了解必须受到限制。我希望有更好的方法来做到这一点,而不是以下。
<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
我确信我做错了。如果我想跟踪大量设备,这将变得重复和繁琐。我是个学习新手的人。任何人都可以指出我正确的方向吗? :)
[编辑]
我将在帖子'/ config'
中尝试以下内容params.keys.each do |key|
@objects.push(params[key])
end
[编辑编辑]
这是我能够提出的最好的。
在我的配置文件中
<% $numofdevices.times do |id| %>
Ip Address: <input type="text" name='<%= id %>[ip]'> Description: <input type="text" name='<%= id %>[desc]'><br />
<% end %>
在我的帖子'config'
params.keys.each do |key|
$devices.push(params[key]) if params[key].include?("ip")
end
现在我不必担心符号的名称或命名方式。 :P
如果有人有任何其他方式做到这一点会更好我会欣赏输入! :)
答案 0 :(得分:1)
这是我能够提出的最好的。
在我的配置文件中
<% $numofdevices.times do |id| %>
Ip Address: <input type="text" name='<%= id %>[ip]'> Description: <input type="text" name='<%= id %>[desc]'><br />
<% end %>
在我的帖子'config'
params.keys.each do |key|
$devices.push(params[key]) if params[key].include?("ip")
end
不,我不必担心符号的名称或命名方式。 :P
如果有人有任何其他方式做到这一点会更好我会欣赏输入! :)