在ActiveStorage继续保存之前,我正在尝试获取用户上传的文件的名称。该表单是使用form_with
生成的,如下所示:
<%= form_with model: upload do |form| %>
<div class="">
<%= form.file_field :files, multiple: true, direct_upload: true, required: true %>
<%= form.label :files, '', class: 'icon ion-ios-cloud-upload' do %>
<span>click the icon to select files</span>
<% end %>
<div class="actions">
<%= form.submit "Upload", class: "btn btn-primary" %>
</div>
</div>
<% end %>
我已经尝试访问params[:upload][files]
并在上面调用.original_filename
,如这里所述,但我得到了错误NoMethodError: undefined method `original_filename' for #<String:0x007fac77fd18c8>
。
当我检查params时,文件确实会以字符串的形式返回,那么我如何获得文件名或如何使original_filename
工作呢?
在附加文件后,我终于能够通过执行file.blob.filename
来获得文件名。
根据ActiveStorage文档,我发现这对我很有用:
file.filename.to_s
在我的情况下,我有一个模型
has_one_attached :file
OP的情况略有不同,您的情况也可能有所不同,因此请相应调整。
特洛伊的解决方案对我来说并不奏效。我不得不添加.to_s
来获得文件名,而不是ActiveStorage::Filename
对象。但我不知道他为什么在里面用.blob
。我不需要它,但也许有一个很好的理由。
您需要将multipart: true
添加到表单中。
https://guides.rubyonrails.org/form_helpers.html#uploading-文件
另一件事是,如果你有多个文件,你就会有多个档案名。
params[:upload][files].each do |file|
file.original_filename
end