Rails 3 - 如何在rails中响应远程表单send_file?

时间:2011-05-16 15:19:34

标签: ruby-on-rails-3 sendfile

我有这张优惠券表格

    <%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 #######

我的Controller的动作类似于

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

3 个答案:

答案 0 :(得分:7)

我有同样的问题,很好。

在我的视图中,我的link_to代码为remote: true

该链接旨在生成PDF的操作。生成PDF(使用prawn和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请求 - &gt;服务器 - &gt;响应 - &gt;重定向 - &gt;客户端 - &gt;请求下载 - &gt; ... ”提到上方。

答案 1 :(得分:2)

我听说解决方案是将重定向发送到端点,send_file从Ajax返回。

所以,Ajax请求 - &gt;服务器 - &gt;回复 - &gt;重定向 - &gt;客户 - &gt;请求下载 - &gt;你留在同一页上。

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

答案 2 :(得分:1)

你在哪里拨打sendfile?我有这样的控制器动作:

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

对我来说很好。