Обучаясь Синатре, я хотел создать веб-приложение, которое бы контролировало устройства через 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
Теперь мне не нужно беспокоиться о том, как называются символы или как они называются. : Р
Тем не менее, если у кого-то есть другие способы сделать это, было бы еще лучше, я был бы признателен за вклад! :)