2013-07-15 8 views
0

레일스 4에서 가상 속성을 할당하는 두 가지 방법의 차이점을 이해하려고합니다. 그 중 하나는 "스택 레벨이 너무 큼"으로 나타나며 그 중 하나가 정상적으로 작동합니다. 나는 새로운 ActiveRecord 배열 필드를 사용하여 텍스트 필드를 파싱하고 태그 필드를 만들기 위해 쉼표로 분리하려고합니다. 다음과 같이 작업 코드는 다음과 같습니다 그러나레일에 가상 속성 할당

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

I 클래스 변수에 할당하여이 모델의 태그 필드를 지정하려면이 옵션을 변경할 때, 그것은 "너무 깊이 스택 레벨"는 발생합니다.

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

누군가 내게 이런 일이 일어나는 이유를 설명 할 수 있습니까? self.tags을 사용하는 것 같아서 스택이 폭발하기 전까지이 가상 속성이 실행됩니다. ActiveRecord의 어느 부분에서이 문제가 발생합니까?

답변

2

stack level too deep 오류는 레일과 관련이 없습니다. 모든 기본 루비 클래스는이 작업을 수행 할 것 : 또 다시, self.tags = 그냥 동일한 개체에 tags=(s)를 다시 실행합니다 호출

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)을 다시 실행하지 않습니다. ActiveRecord의 과도한 단순화는 모델의 모든 필드에 대한 첫 번째 예제와 비슷하다고 가정합니다.