我试图在我的模型中动态创建一个属性中的方法链。到现在为止,我已经有了这个功能:

def create_filtered_attribute(attribute_name)
          alias_attribute "#{attribute_name}_without_filter", attribute_name

          define_method "#{attribute_name}" do
            filter_words(self.send("#{attribute_name}_without_filter"))
          end
end

因此,我收到一个带有属性名称的字符串,请将其拒绝_without_filter'(alias_method或alias_method_chain在这里失败,因为创建类时的属性不在那里),我创建了一个带有属性名称的新方法,我在其中过滤了其内容。

但是不知何故,当我打电话时 “#{attribute_name} _without_filter” 它称之为我的新方法(我认为是因为Alias_AtibTribTribTrib tute of Difter),并且该程序进入堆栈循环。

我试图重命名该属性,因此我可以将其名称用于方法...

有人可以对此启发我。

有帮助吗?

解决方案

有区别 alias_methodalias_attribute. alias_method 实际上是一个 复制 旧方法,而 alias_attribute 只是定义了新方法 打电话给旧的.

注意 model.attributemodel.attribute= ActivereCord中的方法简单地致电 read_attributewrite_attribute, ,因此您始终可以访问您的属性,即使您覆盖它是Getter或Setter:

  define_method "#{attribute_name}" do
    filter_words(self.read_attribute(attribute_name))
  end
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top