2009-07-17 3 views
4

namePerson 모델에 있으며, name 속성에 액세스 할 때마다 name.capitalize이 반환됩니다.레일에 속성 장식하기

def name 
    name.capitalize 
end 

그래서 대안은 무엇인가 작동하지 않습니다 모델 내에서 다음을 수행?

답변

0

이 시도 :

def name 
    self[:name].capitalize 
end 
13

난 당신이 사용자 정의 포맷터와 보조 방법을 작성하는 것이 좋습니다.

class Person 

    def formatted_name 
    name.capitalize 
    end 

end 

이것은 세터와 게터가 데이터베이스에 기록을 저장/업데이트/쓰기라는 수 있기 때문에 기본 구현을 덮어에 비해 더 나은 솔루션입니다. 속성의 기본 구현을 덮어 쓴 다음 레코드가 저장 될 때마다 특성이 형식화 된 값으로 업데이트되었음을 ​​기억합니다.

이 방법을 따르려면 alias_method_chain을 사용하거나 외부 모듈을 포함한 상속을 이용할 수 있습니다.

class Person 

    def name_with_formatter 
    name_without_formatter.capitalize 
    end 
    alias_method_chain :name, :formatter 

end 

또한 당신은 이름을 덮어 및 사용자 정의 메소드 내에서 read_attribute(:name)를 호출 할 수 있습니다.

def name 
    read_attribute(:name).capitalize 
end 

def name 
    self[:name].capitalize 
end 

다시 말해서이 작업을 수행하지 마십시오. 먼저 사용자 정의 메서드를 만듭니다.

+0

마지막 제안을 권유하지 않으시겠습니까? def 이름 자기 [: 이름]. 대문자 끝 우아한 외형은 단지 속성 판독기입니다. 뭐가 문제 야? – user16455

+1

일부 플러그인은 이름에 의존하기 때문에 일부는 self [: name]을 호출합니다. 일관성없는 값으로 끝날 수도 있습니다. –

+0

활성 레코드 http://onehub.com/blog/posts/decorating-activerecord-accessor-methods/의 메소드 연결에 문제가 있습니다. – ahmy

1

하지만 name이 null 일 때 어떻게됩니까?

self [: name]이 nil을 반환하면 capitalize는 nil :: Class에 대해 정의되지 않은 메서드를 throw합니다. I는 당신이 이름 방법을 포맷 방법을 만들고 떠나야한다 동의

def name 
    self[:name] ? self[:name].capitalize : nil 
end 

그러나 :

다음은 것을 다룹니다. 원시 데이터가 필요한시기를 절대 알지 못합니다.

FYI : 왜 당신의 방법이 효과가 없었던 이유는 그것이 원인 이었기 때문에, 내가 부르는 루프, 자체 참조 루프 때문이었습니다. 메소드를 재정의하지만 새 메소드에서 메소드를 호출 중입니다. 따라서 self[:name] 또는 read_attribute을 사용하여 내부 모델 데이터를 얻어야합니다.