[英]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.