繁体   English   中英

访问类属性以在 rails 问题中定义实例方法

[英]Accessing class property to define instance methods in rails concern

经过长时间的停顿,我正在尝试元编程。 我发现了一些问题,但无法解决我的问题,所以我希望有人能启发我。

在 rails 5 应用程序中,我试图编写一个问题,提供一个类方法来设置配置选项。 使用这些选项,我想定义实例方法。

module Base64Attachable
  extend ActiveSupport::Concern

  class_methods do
    attr_reader :base64_attachable_property

    private

    def base64_attachable(property)
      @base64_attachable_property = property
    end
  end

  included do
    # ?
  end
end

上面的问题在User模型中使用:

class User < ApplicationRecord
  include Base64Attachable
  base64_attachable :image
end

在我的理解中,关注点设置了在用户模型中调用的类方法。 但是,我似乎无法在included块中获取base64_attachable_property以根据它的值定义进一步的方法。 我以为我会在included块内的self.class找到我需要的任何东西,但事实并非如此。

这种情况下的目的是使用define_method来定义用户模型中image setter、getter和其他方法。

我在这里缺少什么?

included块在类中包含关注点时运行, base64_attachable :image行尚未运行。

我建议你遵循官方 gems 的做法。 检查 ActiveStorage 例如https://github.com/rails/rails/blob/530f7805ed5790af1d472a041bc74089dc183f47/activestorage/lib/active_storage/attached/model.rb#L35 它在类方法中定义了依赖于该属性的方法(它使用 class_eval,但我想你也可以使用define_method ):

  def has_one_attached(name, dependent: :purge_later)
    generated_association_methods.class_eval <<-CODE, __FILE__, __LINE__ + 1
      def #{name}
        @active_storage_attached_#{name} ||= ActiveStorage::Attached::One.new("#{name}", self)
      end
      def #{name}=(attachable)
        attachment_changes["#{name}"] =
          if attachable.nil?
            ActiveStorage::Attached::Changes::DeleteOne.new("#{name}", self)
          else
            ActiveStorage::Attached::Changes::CreateOne.new("#{name}", self, attachable)
          end
      end
    CODE

    has_one :"#{name}_attachment", ......etc....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM