Ruby on Rails send_file не работает, пока я не обновлю страницу?

Я работаю над сервером Rails, с которого я могу загружать свои локально хранящиеся фильмы, аниме и т. Д. Это работает, но когда я нажимаю на ссылку для скачивания, мне приходится обновлять страницу, чтобы загрузка действительно началась.

Это контроллер, который обрабатывает загрузку:

class DownloadController < ApplicationController
  def index
    @title = params[:title]
    @name = params[:name]
    @path = '/media/sf_Anime,_VN,_LN/Watching, not watched yet/'+@title+'/'+@name
    send_file( @path )
  end
end

и это ссылка, которая ссылается на этот контроллер:

<% @episodes.each do |x| %>
<p> <%= x %><%= link_to " Download", 
    {controller: 'download', action: 'index', title: @title, name: x } %> </p>
<% end %>

редактирование: сегодня я провел небольшое тестирование и заметил, что ссылки для скачивания работают мгновенно, если я пытаюсь отправить файл меньшего размера (текст или изображение). Я также заметил, что ссылки для скачивания на самом деле работают и для фильмов, но для начала загрузки требуется 20-30 секунд. У вас есть какие-либо идеи, что может вызвать эту задержку?


person user3551655    schedule 08.05.2014    source источник


Ответы (4)


Вы используете турболинки? Очевидно, что Turbolinks плохо работает с send_file (https://github.com/rails/turbolinks/issues/182). Попробуйте добавить "data: {no-turbolink: true}" (или "'data-no-turbolink'=>true") в помощнике link_to, например:

<%= link_to "Downloadable File", downloadable_file, data: { no-turbolink: true } %>

См. также: Rails 4, конвейер ресурсов заставляет загружаемые пользователем файлы загружаться дважды, rails не будет отправлять_данные в виде файла, Ruby on Rails send_file, код в действии контроллера выполняется дважды

person k8ydid8    schedule 13.09.2014
comment
Мне пришлось написать это: ‹%= link_to... data: { :no-turbolinks =› true } %›, чтобы оно заработало. Похоже, рубин не любит пунктирные символы. - person ZeDalaye; 29.03.2015
comment
У меня были оба data: {remote: true, :'no-turbolinks' => true}, поэтому удаление remote: true решило проблему. - person ImranNaqvi; 01.06.2019
comment
Хотел бы я купить тебе пива - person Augusto Samamé Barrientos; 24.10.2019

Отредактировано, чтобы отразить комментарий ниже. Я бы просто добавил заботу об обработке загрузок, а затем использовал

include Concerns::Downloads

для обработки вашего запроса на загрузку. route.rb будет выглядеть так.

resources :movies do
member do
  post 'download'
end

и в представлении

  <%= link_to 'Download', {:controller => 'movies', :action => 'download'}, {:method => :post } %></a>
person DMH    schedule 08.05.2014
comment
Я попытался переместить раздел send_file в метод, но это ничего не изменило :/ но спасибо! - person user3551655; 08.05.2014
comment
@user3551655 user3551655 Посмотрев дальше, я бы не стал использовать контроллер загрузки, а вместо этого создал бы проблему в контроллере фильмов, который обрабатывает загрузку ваших фильмов. - person DMH; 08.05.2014
comment
обновил свой пост некоторыми тестами, которые я сделал сегодня. Извините, что не ответил раньше. - person user3551655; 10.05.2014

Переместите файл в общую папку
добавьте только имя файла в link_to

<%= link_to "Downloadable File", "/"+filename, %>
person subbiah    schedule 04.05.2017

Попробуйте установить расположение для вложения в send_file:

class DownloadController < ApplicationController
  def index
    ...
    send_file( @path, :disposition => 'attachment' )
  end
end

Проблема может заключаться в том, что ваш браузер пытается открыть файл сам — :disposition => 'attachment' предлагает браузеру загрузить файл, даже если он считает, что этот файл можно открыть.

person DaveMongoose    schedule 08.05.2014
comment
обновил свой пост некоторыми тестами, которые я сделал сегодня. Извините, что не ответил раньше. - person user3551655; 10.05.2014
comment
'attachment' — это параметр по умолчанию для send_file. - person coreyward; 18.01.2017