Sinatra的动态形式

时间:2011-04-19 19:16:27

标签: ruby forms dynamic sinatra

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

如果有人有任何其他方式做到这一点会更好我会欣赏输入! :)

1 个答案:

答案 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

如果有人有任何其他方式做到这一点会更好我会欣赏输入! :)