我试图在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 %>
我已经尝试按照here的描述访问params[:upload][files]
并在其上调用.original_filename
,但收到错误NoMethodError: undefined method `original_filename' for #<String:0x007fac77fd18c8>
。
检查参数时,文件确实以字符串形式返回,那么如何获取文件名或如何使original_filename
正常工作?
答案 0 :(得分:1)
在附加文件后,我终于可以通过执行file.blob.filename
来获取文件名。
答案 1 :(得分:1)
基于the ActiveStorage documentation,我发现这对我有用:
file.filename.to_s
就我而言,我有一个带有
的模型has_one_attached :file
OP的情况略有不同,您的情况也可能有所不同,因此请进行相应调整。
Troy的解决方案对我原样不起作用。我必须添加.to_s
来获取文件名,而不是ActiveStorage::Filename
对象。但我不确定他为什么在其中使用.blob
。我不需要它,但是也许有充分的理由。
答案 2 :(得分:0)
您需要在表单中添加multipart: true
。
https://guides.rubyonrails.org/form_helpers.html#uploading-files
另一件事是,如果您有多个文件,那么您将拥有多个文件名。
params[:upload][files].each do |file|
file.original_filename
end