Rails 3 – come send_file in risposta a una remota in rails?

Ho questo coupon forma

    <%form_for(:download,:download,:url=>{:controller=>"coupons",:action=>"verifycoupon"},:remote=>true) do |f| %>
    <%=text_field :download,:code%>
    <%=f.submit "verify"%>
    <%end%>

e dopo la convalida del codice sul controller azione ho una conferma, come:

render :update do |page|
    page.alert "OK"
end

Ora voglio inviare un file al browser con il send_file istruzioni ma nulla sembra accadere

send_file("/path/to/my/file.extension")

e nel log vedo

"Sent file /path/to/my/file.extension (0.1ms)"

Mi chiedevo se c’è qualcosa di simile

render :update do |page|
   page.send_file("/path/to/my/file.extension")
end

 

#### Update #######

mio Controller azione simile

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
Grazie, ora lo lascio lì, il suo solo qualcosa di fondamentale 🙂

OriginaleL’autore Mr_Nizzle | 2011-05-16

3 Replies
  1. 2

    Ho sentito dire che la soluzione è quella di inviare un redirect a un punto in cui il send_file indietro dall’Ajax.

    Quindi, Richiesta Ajax -> Server> Risposta -> Redirect -> Client> richiesta di download -> rimanere sulla stessa pagina.

    def show
      # if javascript, then redirect to file_sender
    end
    
    def file_sender
      # Send file from here.
    end

    Vedere qui http://anaphoral.blogspot.com/2009/03/sendfile-or-senddata-in-linktoremote.html

    Ora, come posso proteggere il file_sender azione? sotto il protetto affermazione, perché se ho messo il file_sender azione sotto la protected istruzione non posso page.redirect_to :action=>"file_sender"
    Perchè non renderlo pubblico di fronte endpoint, ma di fornire la stessa before_filter di autenticazione/protezione fornite per lo “spettacolo” in azione”?
    Che potrebbe essere una soluzione, grazie.

    OriginaleL’autore Aditya Sanghi

  2. 6

    Ho lo stesso problema, tipo di bene.

    Nel mio vista ho avuto un link_to tag con remote: true.

    Il link finalizzato un’azione che ha prodotto un PDF. Il PDF è stato generato (con gamberi e thinreports) e inviato, ma la finestra di download non è comparsa.

    Quindi rimuovere il remote: true e aggiungere un target: '_self', è finita così come questo (sto usando haml)

    != link_to image_tag( 'print.png' ) + (I18n.t :buttons)[:comments][:print],
        customer_comment_path(@address_book),
        { target: '_self' }

    E ha funzionato bene.

    Non ho dovuto fare il “Richiesta Ajax -> Server> Risposta -> Redirect -> Client> richiesta di download -> …” di cui sopra.

    Up!, Dimenticavo, il sendfile comando è nel mio CustomerComentsController show metodo.

    OriginaleL’autore OfficeYA Virtual Offices

  3. 1

    Dove si chiama sendfile? Ho un controller azione come questo:

    def show
      # ... skipped initalization of requestedfile
      if File.exists?(requestedfile)
        send_file(requestedfile, :type => "application/pdf", :disposition => "inline"
      end
    end

    Funziona bene per me.

    Il problema è che sto cercando di utilizzare send_file in un remote funzione di chiamata da remoto form_for
    Beh, forse sarebbe bene aggiornare la domanda per essere più chiaro su questo.
    C’è l’aggiornamento, ma credo di aver trovato la risposta giusta sul Aditya Sanghi risposta

    OriginaleL’autore jhwist

Lascia un commento