Carrierwave-Rails iniciar um download sem hacks iframe / javascript

Algumas vezes há um problema envolvendo o download de arquivos em navegadores, principalmente ao tentar usar javascript como Backbone.js, Angular.js ou qualquer outro framework sub js integrado à sua aplicação rails, isso pode ser algumas vezes hacky ou complicado, mas rails tem um maneira realmente fácil de lidar com downloads sem mesmo adicionar um hack de javascript quando você tem um aplicativo de uma página.

basta adicionar o url ao link:

<a href='<%= item_path(@item) %>'> </a>

e em seu controlador use o método mágico:

send_file(
@item.field.url,
filename
: "#{@item.name}.#{@item.extension}",
disposition
: "attachment"
)

explicação:

se você olhar para a API do rails http://apidock.com/rails/ActionController/Streaming/send_file

enviar arquivo recebe 2 argumentos:

  • o caminho para a url
  • opções

dentro das opções, tem muitas possibilidades, mas para tornar isso realmente fácil, tudo que você precisa é:

  • nome do arquivo: com esta opção você precisa passar “nome do arquivo.extensão” como “imagem.jpg” desta forma o navegador irá lidar com o nome do arquivo, mas também se tiver uma extensão, o método irá automaticamente lidar com a solicitação como “html / tipo” onde tipo é a extensão como “html / pdf” ou “html / jpg” e inicia automaticamente um download

  • disposição: para este parâmetro você precisa definir como “anexo” porque alguns arquivos, como imagens, são tratados “inline” dentro do navegador e entregues em uma nova janela ou carregando uma janela vazia com a imagem

existem outros argumentos possíveis, mas são para combinações ao lidar com chances específicas, como quando não há uma extensão no arquivo para ser tratada automaticamente com a opção de nome de arquivo .

espero que tenha sido útil