2011-05-16 46 views
4

我有這個優惠券的形式Rails 3 - 如何在rails中的遠程窗體響應send_file?

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

和核實控制器的動作的代碼後,我有一個確認,如:

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

現在我想將文件發送到瀏覽器與send_file指令但似乎沒有發生

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

,並在日誌中我可以看到

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

我想知道是否有類似

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

 

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

我的控制器的動作看起來像

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 
+0

謝謝,現在我將它留在那裏,它只是一些基本的:) – 2011-05-16 15:49:14

回答

2

我聽說解決方案是將重定向發送到從Ajax返回send_file的終點。

所以,Ajax請求 - >服務器 - >響應 - >重定向 - >客戶端 - >請求哪些下載 - >你呆在同一頁面上。

def show 
    # if javascript, then redirect to file_sender 
end 

def file_sender 
    # Send file from here. 
end 

看到這裏http://anaphoral.blogspot.com/2009/03/sendfile-or-senddata-in-linktoremote.html

+0

現在,我該如何保護'file_sender'動作?就像受保護的狀態員一樣,因爲如果我在'protected'語句下面放置'file_sender'動作,我不能執行'page.redirect_to:action =>「file_sender」' – 2011-05-16 15:42:42

+1

爲什麼不讓它成爲公共端點,但是提供與「show」操作相同的before_filter認證/保護措施? – 2011-05-16 16:08:03

+0

這可能是一個解決方案,謝謝。 – 2011-05-16 16:22:10

1

哪裏給你打電話sendfile?我有一個像這樣的控制器動作:

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

適合我工作。

+0

問題是我試圖在遠程'form_for'遠程函數調用'send_file' – 2011-05-16 15:28:16

+0

嗯,也許它將更好的問題更好地在這個問題上更好。 – jhwist 2011-05-16 15:34:35

+0

有更新,但我想我在Aditya Sanghi的回答中找到了正確答案 – 2011-05-16 15:39:58

5

我有同樣的問題,好樣的。

在我的視圖我有一個link_to標籤與remote: true

該鏈接旨在產生PDF的操作。生成PDF(使用蝦和thinreports)併發送,但下載對話框沒有彈出。

所以我刪除remote: true,並添加target: '_self',所以它弄成這個樣子(我使用HAML)

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

和它的工作就好了。

我沒必要去做「Ajax請求 - >服務器 - >響應 - >重定向 - >客戶端 - >請求下載 - > ...」上面提到的。

+0

Ups!,我忘記了,'sendfile'命令在** show **方法下的** CustomerComentsController **中。 – 2012-11-01 20:19:34