Ruby on rails 如何在上载时或之前自动清理ActiveStorage Blob文件名?

Ruby on rails 如何在上载时或之前自动清理ActiveStorage Blob文件名?,ruby-on-rails,ruby,rails-activestorage,Ruby On Rails,Ruby,Rails Activestorage,我正在一个大型Rails应用程序上使用ActiveStorage,客户端似乎无法从非url安全字符中清除自己的文件名。我无法找到一种在框架本身内自动完成这项工作的方法。我不希望在前端输出文件URL时只输出一个经过消毒的文件名,因为这可能会让其他开发人员在以后调试问题时感到困惑 ActiveStorage::Blob.filename返回一个filename实例,该实例上有一个sanitized方法,但是我似乎看不到它实际在哪里使用 Blob::文件名: 文件名: Rails文档描述了如何附加文件

我正在一个大型Rails应用程序上使用
ActiveStorage
,客户端似乎无法从非url安全字符中清除自己的文件名。我无法找到一种在框架本身内自动完成这项工作的方法。我不希望在前端输出文件URL时只输出一个经过消毒的文件名,因为这可能会让其他开发人员在以后调试问题时感到困惑

ActiveStorage::Blob.filename
返回一个
filename
实例,该实例上有一个
sanitized
方法,但是我似乎看不到它实际在哪里使用

Blob::文件名:

文件名:

Rails
文档描述了如何
附加
文件,但是这是针对单个文件的,如果客户端同时上载多个文件,则不适用:

另一个SO问题提出了类似的问题,但要求更新记录,而不是在创建时进行消毒:

另一篇媒体文章建议在模型上添加一个after save,但该应用程序在每个模型上使用多个附件名称,并且在多个模型上使用附件,因此,这同样不是一个合适的解决方案:

我觉得这应该很简单,但事实证明这是一个相当大的问题

任何帮助都将不胜感激

  # Returns an ActiveStorage::Filename instance of the filename that can be
  # queried for basename, extension, and a sanitized version of the filename
  # that's safe to use in URLs.
  def filename
    ActiveStorage::Filename.new(self[:filename])
  end
  # Returns the sanitized filename.
  #
  #   ActiveStorage::Filename.new("foo:bar.jpg").sanitized # => "foo-bar.jpg"
  #   ActiveStorage::Filename.new("foo/bar.jpg").sanitized # => "foo-bar.jpg"
  #
  # Characters considered unsafe for storage (e.g. \, $, and the RTL override character) are replaced with a dash.
  def sanitized
    @filename.encode(Encoding::UTF_8, invalid: :replace, undef: :replace, replace: "�").strip.tr("\u{202E}%$|:;/\t\r\n\\", "-")
  end