【问题标题】:alias_attribute and creating and method with the original attribute name causes a loopalias_attribute 和使用原始属性名称创建和方法会导致循环
【发布时间】:2010-05-27 19:17:30
【问题描述】:

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

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_attribute 某种方式),然后程序进入堆栈循环。

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

有人可以请教我。

【问题讨论】:

    标签: ruby-on-rails alias-method alias-method-chain


    【解决方案1】:

    alias_methodalias_attribute 之间存在差异。 alias_method 实际上是复制旧方法,而alias_attribute 只是定义新方法,调用旧方法

    请注意,ActiveRecord 中的 model.attributemodel.attribute= 方法只需调用 read_attributewrite_attribute,因此您始终可以访问您的属性,即使您覆盖了它的 getter 或 setter:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    相关资源
    最近更新 更多