扩展 ActiveStorage::Attachment - 添加自定义字段

2024-04-16

我想扩展 ActiveStorage::Attachment 类并添加一个枚举属性以实现附件的可见性。

我最初的方法是在 \app\models 目录中创建一个新文件attachment.rb,如下所示。

class ActiveStorage::Attachment < ActiveRecord::Base
    enum visibility: [ :privately_visible, :publicly_visible]
end

这是行不通的。

欢迎任何建议。 Rails 扩展类的方式是什么?

Update

我有一个现在部分有效的解决方案。 为此,我创建了一个扩展 active_storage_attachment_extension.rb 并将其放置在 \lib 中

module ActiveStorageAttachmentExtension

  extend ActiveSupport::Concern

  included do
    enum visibility: [ :privately_visible, :publicly_visible]

    def describe_me
      puts "I am part of the extension"
    end

  end
end

扩展在初始化期间加载到extensions.rb中

ActiveStorage::Attachment.send(:include, ::ActiveStorageAttachmentExtension)

不幸的是,它只发挥了部分作用: 而枚举方法public_visible?和私人可见?在视图中可用,但在控制器中不可用。当调用控制器中的任何方法时,枚举似乎消失了。我收到“NoMethodError - 未定义方法”错误。 令人惊讶的是,一旦在控制器中调用了枚举方法一次,它们在视图中就不再可用。 我假设 ActiveStorage::Attachment 类会动态重新加载,并且扩展会丢失,因为它们仅在初始化期间添加。

有任何想法吗?


我假设 ActiveStorage::Attachment 类会动态重新加载,并且扩展会丢失,因为它们仅在初始化期间添加。

你是对的。使用Rails.configuration.to_prepare http://api.rubyonrails.org/classes/ActiveSupport/Reloader.html#method-c-to_prepare在应用程序启动后和每次重新加载代码时混合您的模块:

Rails.configuration.to_prepare do
  ActiveStorage::Attachment.send :include, ::ActiveStorageAttachmentExtension
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

扩展 ActiveStorage::Attachment - 添加自定义字段 的相关文章

随机推荐