2015-10-17 3 views
0

Ниже мое шоу-код в контроллере:Перенаправление не работает после загрузки файла

def show 
    @archive = Archive.find(params[:id]) 
    if @archive.eula.blank? || params[:eula] == "1" 
    send_archive(@archive) and return 
    # redirect_to archives_url and return 
    else 
    @eula = @archive.eula 
    render 
    end 
end 

def send_archive(archive) 
    head(:x_accel_redirect => archive.download.url, :content_type => archive.download.content_type, :content_disposition => "attachment; filename=#{archive.download.original_filename}") 
end 

Для каждой загрузки, я отображая соглашение EULA к пользователю @eula = @archive.eula. У этой eula есть две кнопки «Принять» и «Отклонить». Если пользователь нажимает «снижение», мы просто возвращаемся к странице загрузки. Если пользователь нажимает «Принять», мы загрузим файл для пользователя. Но даже после загрузки файла страница не возвращается на страницу загрузки. Страница Eula по-прежнему отображается пользователю. Если я поставил redirect_to archives_url and return после send_archive, он выдает ошибку:

Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action...

Просьба помочь мне решить эту проблему.

+1

Вы не можете отправить ответ перенаправления HTTP 3xx и файл в тот же ответ. Если вы хотите перенаправить пользователя после нажатия кнопки загрузки, вам нужно будет использовать javascript. – max

+0

PS. вы можете использовать ['send_file'] (http://apidock.com/rails/ActionController/Streaming/send_file) – max

+0

в простой форме, которую вы не можете обработать на стороне сервера. – Nithin

ответ

0

Созданный файл 'eula.js' на месте: приложение/активы/JavaScripts eula.js содержит следующий код:

var interval = null; 
$(document).ready(function() { 
    function myFunction(){ 
     if(window.location.href === "http://www.yoursite.com") 
     { 
      clearInterval(interval); 
     } 
     else { 
      window.location.href = "http://www.yoursite.com"; 
     } 
    } 

    $('#Accept').click(function (event) { 
     interval = setTimeout(myFunction, 5000); 
     event.preventDefault(); 
    }); 
}); 

В show.html.erb, что вам нужно добавьте :id => "Accept", чтобы js мог распознать нажатие кнопки. Теперь, когда пользователь нажимает кнопку «Принять», загрузка начнется для него, и через 5 секунд нажмите, страница будет перенаправлена ​​в ваше определенное местоположение. Этот кусок кода отлично работает для меня.

Смежные вопросы