Доброе утро!
У меня есть форма, которая принимает IP-адрес, дату начала и дату окончания, которая вызывает рабочий процесс SideKiq, который выполняет скрипт на внешнем сервере через ssh, а затем отправляет полученный файл на локальный сервер по протоколу sFTP.
Метод контроллера:
def create
@script = Script.new(params[:script])
if @script.valid?
@job_id = LogsWorker.perform_async(@script.ip, @script.start_date, @script.stop_date)
else
render :action => 'new'
end
end
Рабочий SideKiq:
def perform(ip, start_date, stop_date)
Net::SSH.start('server', 'username') do |ssh|
result = ssh.exec!("<script here> #{ip} #{start_date} #{stop_date}")
ssh.sftp.connect do |sftp|
local_result = "#{Rails.root}/public/uploads/" + File.basename(result)
sftp.download!(result, local_result)
end
end
.. to be continued ..
У меня также есть рабочий процесс SideKiq, который анализирует полученный файл в хэш:
.. continuing ..
@file_hash = {}
i = 0
File.open(local_result, "r") do |fp|
fp.each_line do |line|
ip, date, method, url_full = line.split("\t")
@file_hash[i] = {ip: ip, date: date, method: method, url_full: url_full}
i += 1
end
end
end
И частичный _results.html.erb
, который его анализирует:
<% if @file_hash %>
<% @file_hash.each do |key, value| %>
<tr>
<td><%= value[:ip] %></td>
<td><%= value[:date] %></td>
<td><%= value[:method] %></td>
<td><%= value[:url_full] %></td>
</tr>
<% end %>
<% end %>
Я попытался отобразить результаты после завершения задания с помощью <%= render partial: 'results', locals: { file_hash: @file_hash } %>
в файле create.js.coffee, но я не думаю, что он имеет какое-либо представление о переменной экземпляра.
Как я могу передать результат из заполненной переменной SideKiq в представление? Я думаю, я должен отметить, что у меня есть другой метод контроллера, который запрашивает процент выполнения задания SideKiq, поэтому я должен быть в состоянии определить, когда оно будет завершено.
Редактировать:
percentage_done
в контроллере
def percentage_done
job_id = params[:job_id] # grabbing the job_id from params
container = SidekiqStatus::Container.load(job_id)
@pct_complete = container.pct_complete
respond_to do |format|
format.json {
render :json => {
:percentage_done => @pct_complete, # responding with json with the percent complete data
}
}
end
end
текущий аякс
queryForPercentage = () ->
job_id = $('#job_id').text() # grabbing the job_id
$.ajax({
url: "/percentage_done" # sending an ajax request to /percentage_done
data: job_id: job_id # using the job_id from the DOM
success: (data) -> # executed after a successful call to the percentage_done controller
percentage = 'width: ' + data['percentage_done'] + '%;'
# writing the percentage done to the progress bar
$('#job-progress').attr('style', percentage).text(data['percentage_done'] + '%')
$('#job-progress').attr('aria-valuenow', data['percentage_done'])
if $('#job-progress').text() != '100%'
setTimeout((-> queryForPercentage()), 1500)
else
# replace the html of the div script_lists with the updated new one
$("#scripts_list").html("<%= escape_javascript(render partial: 'results', locals: { file_hash: @file_hash } ) %>");
})
queryForPercentage()