Rails 3 - comment envoyer_file en réponse à un formulaire distant dans Rails ?
-
14-11-2019 - |
Question
J'ai ce formulaire de coupon
<%form_for(:download,:download,:url=>{:controller=>"coupons",:action=>"verifycoupon"},:remote=>true) do |f| %>
<%=text_field :download,:code%>
<%=f.submit "verify"%>
<%end%>
et après avoir validé le code sur l'action du contrôleur j'ai une confirmation du genre :
render :update do |page|
page.alert "OK"
end
Maintenant, je veux envoyer un fichier au navigateur avec le send_file
instruction mais rien ne semble se passer
send_file("/path/to/my/file.extension")
et dans le journal je peux voir
"Sent file /path/to/my/file.extension (0.1ms)"
Je me demandais s'il y avait quelque chose comme
render :update do |page|
page.send_file("/path/to/my/file.extension")
end
#### Update #######
l'action de mon contrôleur ressemble à quelque chose comme
def verifycoupon
code = Code.find(params[:download][:code])
if code
if code.is_active?
render :update do |page|
page.alert "ok"
end
send_file("/path/to/my/file.extension")
else
render :update do |page|
page.alert "this code has already been used"
end
end
else
render :update do |page|
page.alert "Code does't exist"
end
end
end
La solution
J'ai entendu dire que la solution consiste à envoyer une redirection à un point de fin où l'envoi Send_File de Ajax.
Donc, Ajax Demande -> Serveur -> Réponse -> Redirection -> Client -> Demande qui téléchargée -> Vous restez sur la même page.
def show
# if javascript, then redirect to file_sender
end
def file_sender
# Send file from here.
end
Voir ici http://anaphoral.blogspot.com / 2009/03 / sendfile-or-senddata-in-linktoremote.html
Autres conseils
J'ai le même problème, en quelque sorte.
Dans mon voir J'ai eu un link_to
taguer avec remote: true
.
Le lien visait une action qui produisait un PDF.Le PDF a été généré (avec Prawn et ThinReports) et envoyé, mais la boîte de dialogue de téléchargement ne s'est pas affichée.
J'enlève donc le remote: true
et ajoutez un target: '_self'
, donc ça s'est terminé comme ça (j'utilise haml)
!= link_to image_tag( 'print.png' ) + (I18n.t :buttons)[:comments][:print],
customer_comment_path(@address_book),
{ target: '_self' }
Et ça a très bien fonctionné.
Je n'ai pas eu à faire le "Requête Ajax -> Serveur -> Réponse -> Redirection -> Client -> demande qui télécharge -> ..." mentionné ci-dessus.
Où appeler sendfile
?J'ai une action de contrôleur comme celle-ci :
def show
# ... skipped initalization of requestedfile
if File.exists?(requestedfile)
send_file(requestedfile, :type => "application/pdf", :disposition => "inline"
end
end
Fonctionne bien pour moi.