Forçar o download de um arquivo numa aplicação rails, ao invés de deixar o conteúdo ser carregado no navegador é bastante simples.
Tenho visto em vários fóruns uma centena de workarounds utilizando headers bem conhecidos, ou então um header um pouco mais obscuro, que a princípio daria mais velocidade e segurança ao download, mas que só funciona se você roda sua aplicação no Apache ou no Lighttpd, pois usa o mod_xsendfile.
Contudo, o próprio rails possui um método para lidar facilmente com isso, o send_file.
Neste caso eu mantive o caminho e mimetype da imagem em banco de dados após fazer o upload dela. Cobrirei o tópico upload em outro post mais pra frente. Assim, para utilizar o send_file, basta colocar em seu controller:
class MyController < ApplicationController
def downloadFile
# encontra os dados do arquivo procurado através de seu id
@file = myFile.find(params[:id])
# pega o nome do arquivo
filename = #{File.basename(@file.path)}
# pega o mimetype do arquivo
mimetype = @file.mimetype
# veja que o parâmetro disposition está com o valor attachment
send_file "#{RAILS_ROOT}/caminho/do/arquivo/" + filename,
:type => mimetype,
:disposition => 'attachment'
end
# outros métodos de sua classe controller
(...)
end
Com isso, o navegador não é redirecionado para outra página, removendo a necessidade de utilizar headers e o arquivo é enviado para download, já com mimetype reconhecido.
See ya