访问before_save回调中的非ActiveRecord属性

时间:2012-11-30 21:17:07

标签: ruby-on-rails ruby-on-rails-3

在我看来,我使用<%= f.text_field :latlon %>编辑latlon属性(不是ActiveRecord列)。保存时,我想解析latlong并在lat回调中将其拆分为lonbefore_save

我不知道如何访问回调中latlon变量的参数。我尝试了self.latlong,但调用与attr_readerlat属性相同的lon

我知道我可以在控制器中执行此操作,但这是模型逻辑,不是吗?

#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

3 个答案:

答案 0 :(得分:3)

您可以覆盖分配方法以执行您所描述的操作。这样可以更快/更容易地进行单元测试。

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

答案 1 :(得分:1)

我认为您可以用

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

也许不要制作:lat和:lon attr_accessible的一部分,因为它们永远不会被大量分配,即来自params数组。从控制器传递的params将包含latlon值(格式正确)。

在这种情况下,我认为你不需要before_save

答案 2 :(得分:0)

该模型应该可以访问您可以使用的实例变量@latlon,对吗?