【问题标题】:Assigning Virtual Attribute in Rails在 Rails 中分配虚拟属性
【发布时间】:2013-07-15 12:57:12
【问题描述】:

我试图了解这两种在 Rails 4 中分配虚拟属性的方法之间的区别。其中一种会导致“堆栈级别太深”,而其中一种可以正常工作。我试图通过解析文本字段并用逗号分割它来创建一个标签字段来使用新的 ActiveRecord 数组字段。工作代码如下:

class Post < ActiveRecord::Base
  def tags=(s)
    self[:tags] = s.split(/,\s+/)
  end
end

但是,当我将其更改为通过分配给类变量来分配此模型中的标记字段时,它会导致“堆栈级别太深”。

class Post < ActiveRecord::Base
  def tags=(s)
    self.tags = s.split(/,\s+/)
  end
end

有人能解释一下为什么会发生在我身上吗?似乎使用 self.tags 会导致此虚拟属性运行,直到堆栈爆炸。 ActiveRecord 的哪一部分导致了这种情况?

【问题讨论】:

    标签: ruby-on-rails-4 virtual-attribute


    【解决方案1】:

    stack level too deep 错误与 rails 无关。任何基本的 Ruby 类都会这样做:

    class Post
      def tags=(s)
        self.tags = s
      end
    end
    
    > Post.new.tags = "a,b,c"
    SystemStackError: stack level too deep     
    

    调用self.tags = 只会在同一个对象上一遍又一遍地重新执行tags=(s)。在您的第一个示例中,您直接通过self[:tags] = 设置属性,这根本不会重新执行tags=(s)。我会假设 ActiveRecord 的过度简化是它对模型的所有字段执行类似于您的第一个示例的操作。

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多