快速背景:想发送一个pdf给客户端下载,有些pdf是静态的,有些是我们用pdftk生成的。
所以我在看了这个问题后把它一起破解了:
Rails 3 - 如何发送文件以响应 Rails 中的远程表单?
HTML
<select id="download_policy_docs_select">
<%= options_for_select(@file_list) %>
</select>
<input id="download_policy_doc" type="submit" class="btn btn-info btn-180px" value="DOWNLOAD" />
阿贾克斯
$('#download_policy_doc').click(function(){
var doc = $('#download_policy_docs_select').val();
var policy_name = $('h1 :first').html();
console.log("hello");
$.ajax({
type: "POST",
url: "/policies/ajax_get_policy_document.pdf",
timeout: 3000,
success: do_the_success,
data: {document : doc, policy_name : policy_name}
});
});
政策控制器:
def policy_declaration(id)
policy = Policy.find(params[:id] || id)
return unless enforce_policy_access(policy)
file_path = PolicyPdf.generate_policy_declaration(policy)
send_file(file_path, :filename => "#{policy.name}_declaration.pdf", :disposition => 'Content', :type => 'application/pdf')
end
def ajax_get_policy_document
policy = Policy.find_by_name(params[:policy_name])
if params[:document] == 'proof_of_insurance'
redirect_to :action => 'policy_declaration'
elsif params[:document] == 'master_cert'
#redirect_to PolicyPdf.get_policy_pdf_filepath(policy)
elsif params[:document] == 'im_declaration'
redirect_to :action => 'policy_declaration'
elsif params[:document] == 'im_master_cert'
# redirect_to PolicyPdf.get_policy_pdf_filepath(policy)
elsif params[:document] == 'invoice'
redirect_to policy_invoice
elsif params[:document] == 'legacy_cert'
redirect_to :action => 'policy_declaration'
else
"it's broke!"
end
end
我的理解是,虽然 ajax 无法下载文件,但如果我重定向到这个其他方法policy_declaration
并让它发送文件,:disposition
那么我实际上可以下载一个文件,因为它是从服务器发送的 - 但不是作为对 ajax 请求的响应。
所以,我的问题是:
- 我的理解哪里出错了?
- 我可以修复我当前的代码以按需要工作吗?
- 如果我不能做到以上,我该怎么办?
即使答案是“不,你不能使用表格来做到这一点”,我仍然想知道我的理解哪里出了问题。
另外,如果有人问我为什么要这样做。我对导轨不是很好form_helpers
(这是很多其他问题所说的)......所以如果这是答案,那么在这个方向上的一些帮助将非常感激。