我的 Rails 应用程序中遇到了一个很奇怪的情况。
我有一个用于上传文档(即 PDF)的 API 调用,它通过其类定义中的
has_one_attached :file
附加到 Document 对象。
def create
if can? :create, Document
@document = Document.new(document_params.except(:upload_files))
if document_params[:upload_files].present?
uploaded_file = document_params[:upload_files].first
@document.file_name = uploaded_file.original_filename
@document.file_size = uploaded_file.size.to_s
@document.file_type = uploaded_file.content_type
@document.file.attach(io: uploaded_file.tempfile, filename: uploaded_file.original_filename, content_type: "application/pdf", identify: false).save
end
if @document.save
redirect_to document_path(@organization, id: @document.id), notice: "Document successfully saved."
else
redirect_to root_path, alert: "Document could not be saved."
end
else
raise CanCan::AccessDenied
end
end
如果我进入控制台,检查文档是否有附加文件,它会返回 true:
pry(main)> doc.file.attached?
...
=> true
如果我直接进入表格,我也可以确认它在那里。
19,file,Document,88,19,2024-12-04 00:55:29.154261
一切都好,对吧?好吧,当我使用
Download
API 调用时,我会得到一个为该文件生成的链接以供下载:
def download
respond_to do |format|
format.json do
if @document.file.attached?
file_url = rails_blob_url(@document.file, disposition: "attachment", content_type: @document.file_type)
render json: { document: { file: file_url } }
else
render json: { error: "File not found" }, status: :not_found
end
end
format.html { proxy_attachment_file_render(@document.file) }
end
end
我在 AJAX 调用中检索所述链接:
$.ajax({
url: 'path/to/download/api'
dataType: 'json',
method: 'GET',
success: function(response) {
console.log(response)
if (response.document && response.document.file) {
const fileUrl = response.document.file;
const link = document.createElement('a');
link.href = fileUrl;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
} else {
alert('File not available for download.');
}
},
error: function() { alert('Error fetching the file.');}
});
但我最终得到的结果是这些空/不存在的文件,其中浏览器告诉我
the file wasn't available on site
。
所以我对文件如何上传、附加到类以及如何存在感到有点困惑,但是当我尝试下载文件时,它无法返回。我在这里做错了什么?任何帮助将不胜感激。
好吧,我明白了。
尽管所有证据都表明文档已被保存,但事实是,它仍然没有被 ActiveRecord 正确保存。因此,我必须对文档的创建/保留方式进行一些扩充:
if document_params[:upload_files].present?
document_params[:upload_files].each do |file|
@document = @organization.documents.create(document_params.except(:upload_files))
@document.file.attach(
io: File.open(file.tempfile),
filename: file.original_filename
)
end
@document.save
end