2012-11-30 4 views
1

필자는 <%= f.text_field :latlon %>을 사용하여 ActiveRecord 열이 아닌 latlon 특성을 편집합니다. 절약 할 때 latlong을 구문 분석하고 before_save 콜백에서 latlon으로 분할하고 싶습니다.before_save 콜백의 비 ActiveRecord 특성에 대한 액세스

콜백 내의 변수 latlon의 매개 변수에 액세스하는 방법을 모르겠습니다. 나는 self.latlong을 시도했지만 latlon 속성과 동일한 attr_reader을 호출합니다.

컨트롤러에서이 작업을 수행 할 수 있다는 것을 알고 있지만, 이것은 모델 논리입니다.

#app/models/bla.rb 
class Bla < ActiveRecord::Base 
    attr_accessible :name, :lat, :lon, :latlon #but latlon is not an ActiveRecord Attribute 

    before_save :foo 

    def latlon 
    "#{lat}, #{lon}" 
    end 

    attr_writer latlon 

    private 

    def foo 
    self.lat = # regex that parse latlon 
    self.lon = # regex that pase coors 
    end 

end 
+0

오류를 게시 할 수 있습니까? –

+0

예, 이것은 모델 논리이지만 컨트롤러에서 올바른 값을 전달해야합니다. –

+0

정확히는 오류가 아닙니다. 문제는 latlon 메서드 (attr_reader)를 호출하면 실제 값 대신 "# {lat}, # {lon}"이 반환됩니다. – eveevans

답변

1

난 당신이

def latlon=(latlon) 
    self.lat = # regex that parses lat from latlon 
    self.lon = # regex that parses lon from latlon 
end 

attr_writer latlon를 대체 할 수 있다는 생각 그리고 어쩌면하지 않습니다 : 위도와 : attr_accessible의 경도 부분들이 params에서, 할당 된 질량, 즉 결코 때문에 정렬. 컨트롤러에서 전달 된 paramslatlon 값 (올바르게 형식화 됨)을 포함합니다.

이 경우 before_save이 필요하지 않습니다.

+1

예, 이것은 @Xathras가 제안한 것과 같습니다 :-) –

0

모델에서 사용할 수있는 인스턴스 변수 @latlon에 액세스해야합니다. 맞습니까?

+0

예,하지만 실제 가치 대신 "# {lat}, # {lon}"이 될 내 latlon 메서드 (attr_reader)를 호출합니다 – eveevans

+1

http://stackoverflow.com/questions/5046831/why-use-ruby-attr-accessor-attr-reader-and-attr-writer –

3

설명 방법을 대신 할 수있는 할당 방법을 재정의 할 수 있습니다. 이것은 유닛 테스트를 더 빠르고 쉽게 할 수있는 보너스입니다.

def latlon=(new_value) 
    # do work to split and assign 
end 
+0

더 빠르고 쉽게 단위 테스트를 할 수 있습니다. –

관련 문제