2012-11-30 61 views
1

在我看來,我使用<%= f.text_field :latlon %>來編輯latlon屬性(不是ActiveRecord列)。保存時,我想解析latlong並將其拆分爲latlon中的before_save回調。訪問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也許不作:LAT和:的attr_accessible LON部分,因爲他們將永遠不會大規模分配,即從params陣列。從控制器傳遞的params將包含latlon值(格式正確)。

在這種情況下,我認爲你不需要before_save

+1

是的,這與@Xathras提示的相同:-) –

0

該模型應該有權訪問您可以使用的實例變量@latlon,對嗎?

+0

是的,但它會調用我的latlon方法(attr_reader),它將是「#{lat},#{lon}」,而不是它的實際值 – eveevans

+1

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

3

你可以重寫賦值方法來完成你所描述的內容。這有助於更快/更容易地進行單元測試。

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

+1更快/更容易單元測試 –