【问题标题】:Getting filename before saving in ActiveStorage - Rails 5.2.1在 ActiveStorage 中保存之前获取文件名 - Rails 5.2.1
【发布时间】:2018-11-27 18:12:12
【问题描述】:

我试图在 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] 并按照here 的描述在其上调用.original_filename,但我收到错误NoMethodError: undefined method `original_filename' for #&lt;String:0x007fac77fd18c8&gt;

当我检查参数时,文件确实以字符串形式返回,那么如何获取文件名或如何让 original_filename 工作?

【问题讨论】:

    标签: ruby-on-rails rails-activestorage ruby-on-rails-5.2


    【解决方案1】:

    在附加文件后,我终于可以通过file.blob.filename 获取文件名。

    【讨论】:

    • 您需要.blob吗?我不需要它,而且它似乎对我没有任何影响。有什么好处吗?
    【解决方案2】:

    基于the ActiveStorage documentation,我发现这对我有用:

    file.filename.to_s
    

    就我而言,我有一个带有

    的模型
    has_one_attached :file
    

    OP的情况略有不同,你的情况也可能有所不同,请相应调整。

    Troy 的解决方案不适合我。我必须添加 .to_s 来获取文件名而不是 ActiveStorage::Filename 对象。但我不确定他为什么在那里使用.blob。我不需要它,但也许有一个很好的理由。

    【讨论】:

      【解决方案3】:

      您需要在表单中添加multipart: true

      https://guides.rubyonrails.org/form_helpers.html#uploading-files

      另一件事是,如果您有多个文件,您将有多个文件名。

      params[:upload][files].each do |file|
        file.original_filename
      end
      

      【讨论】:

      • form_with 已经添加了,但我尝试将 multipart: true 添加到表单中,但它不起作用
      猜你喜欢
      • 2018-10-20
      • 2018-11-11
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      相关资源
      最近更新 更多