ruby-on-rails 如何指定Rails7中Action Text允许的附件文件类型?

gtlvzcf8  于 2022-12-27  发布在  Ruby
关注(0)|答案(2)|浏览(113)

我想指定我的ActionText只允许图像文件类型。我在我的模型rb文件中尝试过:

has_rich_text :content, attachments: { content_type: ['image/png', 'image/jpg', 'image/jpeg', 'image/gif'] }

但我得到了这个错误:

unknown keyword: :attachments
ygya80vv

ygya80vv1#

has_rich_text没有附件选项。
你必须使用has_one_attached作为图像附件。这些附加的图像可以很容易地在操作文本中使用sgid来引用。引用

has_many_attached :photos

对于内容类型验证:

validates :photos, attached: true, content_type: ['image/png', 'image/jpeg']

要引用sgid(签名的GlobalID):

photo.to_signed_global_id.to_s # here photo is one photo object
7d7tgy0s

7d7tgy0s2#

我可以想象您必须覆盖/修饰RichText模型来添加一些验证,但我不确定这将如何工作。
另一方面,在前端拒绝文件很容易:

// app/javascript/application.js

import "trix"
import "@rails/actiontext"

const allowedImageTypes = ["image/png", "image/jpg", "image/jpeg", "image/gif"]

document.addEventListener("trix-file-accept", e => {
  if (allowedImageTypes.includes(e.file.type)) {
    console.log("attach");
  } else {
    e.preventDefault();
    console.log("reject");
    // TODO: show useful notification
  }
})
  • https://github.com/basecamp/trix#storing-attached-files*

这就是你所需要的,但是如果你想在服务器端验证,你必须上传文件到你自己的控制器,并做所有额外的工作,将结果插入到trix编辑器中,所有这些工作通常都是通过*@rails/actiontext * 完成的:

  • 一个月一次 *
    • 更新**

不用担心额外的工作,想通了。上面的JavaScript是前端的,下面的是后端验证的:

ALLOWED_IMAGE_TYPES = %w[image/png image/jpg image/jpeg image/gif]

# NOTE: this creates a `has_one :rich_text_#{name}` association where
#       attachments can be accessed
has_rich_text :content

after_validation do
  rich_text_content.body.attachables.each do |attachment|
    unless ALLOWED_IMAGE_TYPES.include? attachment.content_type
      errors.add(:content, "includes unsupported image type")
    end
  end
end

相关问题