Я нашел эту жемчужину, чтобы использовать индикатор выполнения бутстрапа и задержанную работу. В своем примере он использует файл.haml, но я использую erb и coffeescript в своем проекте, поэтому я попытался воспроизвести то, что он делает.
Это мой контроллер
def export
@job = Delayed::Job.enqueue StandingsJob.new
end
это route.rb
get 'export', to: 'scraper#export'
и это мой home.erb.html
<%= link_to 'export', export_path, {id:'mario', remote: true} %>
<div class="progress">
<div class="progress-bar progress-bar-striped active" role="progressbar"
aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:0%">
0%
</div>
</div>
и это мой файл coffeescript
$(document).on "turbolinks:load", ->
$('#mario').on 'click', ->
alert('hocliccatoooo')
interval = setInterval( ->
$.ajax(
url: '/progress-job/' **** What should I add here?????****,
success: (job) ->
console.log('loool')
stage
progress
if job.last_error != null
$('.progress-status').addClass('text-danger').text(job.progress_stage);
$('.progress-bar').addClass('progress-bar-danger');
$('.progress').removeClass('active');
clearInterval(interval);
if job.progress_stage != null
stage = job.progress_stage
progress = job.progress_current / job.progress_max * 100
else
progress = 0
stage = 'Uploading file?'
if progress != 0
$('.progress-bar').css('width', progress + '%').text(progress + '%')
$('.progress-status').text(stage);
error: ->
alert('errore')
$('.progress').removeClass('active');
$('.progress-bar').css('width', '100%').text('100%');
$('.progress-status').text('Finito!!!');
clearInterval(interval);
)
, 100)
Код работает правильно, когда я нажимаю на ссылку, единственная проблема заключается в том, как я могу сообщить моему coffeescript идентификатор задания, которое я создал в своем действии контроллера? Спасибо вам всем
[РЕДАКТИРОВАТЬ]
Это моя работа
class StandingsJob < ProgressJob::Base
def perform
update_stage 'Faccio cose'
update_progress_max 10
for i in [0..10]
sleep(2)
update_progress
end
end
end
Я сделал кое-что, и кажется, что метод perfom моей работы никогда не уволен (я помещаю puts 'lol' в мой метод выполнения, и я никогда не вижу его в консоли)
interval = setInterval (-> var paramJob = '<% = @job.to_json%>';//получить параметр @job ->
//используем строку "&" + "quot;" вместо SYM
var jobObj = JSON.parse(('{' + paramJob.slice(paramJob.indexOf("SYMid"), paramJob.length)). replace (/SYM/g, '"'));//Параметры обрабатываются
//в ajax используйте jobObj.id url: '/progress-job/' + jobObj.id,
надеюсь, это поможет вам!
Это проблема с клиентской стороной и сервером.
Вы должны будете поместить идентификатор задания в атрибут data- в теге html во время рендеринга на стороне сервера. Он должен быть в переменной @job на основе действия вашего контроллера.
После того, как ваша страница отображается, и вы находитесь в коде coffeescript (теперь клиентская сторона). Вы можете разобрать этот атрибут и использовать его.