Динамическая форма в Синатре - PullRequest
1 голос
/ 19 апреля 2011

Обучаясь Синатре, я хотел создать веб-приложение, которое бы контролировало устройства через ICMP и отображало результаты в браузере.

У меня есть страница конфигурации, где пользователь решает, сколько устройств он хочет контролировать, а также 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, должны быть ограничены. Я надеялся, что есть лучший способ сделать это, а не следующее.

<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

Я уверен, что я делаю это неправильно. Если я хочу отслеживать большое количество устройств, это становится повторяющимся и громоздким. Я учусь новичок. Кто-нибудь может указать мне правильное направление? :)

[EDIT]

Я собираюсь попробовать следующее в моем посте '/ config'

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 %>

В моем посте 'config'

params.keys.each do |key|
    $devices.push(params[key]) if params[key].include?("ip")
  end

Теперь мне не нужно беспокоиться о том, как называются символы или как они называются. : Р

Тем не менее, если у кого-то есть другие способы сделать это, было бы еще лучше, я был бы признателен за вклад! :)

1 Ответ

1 голос
/ 20 апреля 2011

Вот лучшее, что я смог придумать.

В моем конфиге erb

<% $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

Тем не менее, если у кого-то есть другие способы сделать это, было бы еще лучше, я был бы признателен за вклад!:)

...