1

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

我不知道如何访问latlon回调中变量的参数。我已经尝试过self.latlong,但调用与attr_readerandlat属性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
4

3 回答 3

3

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

def latlon=(new_value)
  # do work to split and assign
end
于 2012-11-30T21:39:08.613 回答
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在这种情况下,我认为您不需要。

于 2012-11-30T21:40:09.660 回答
0

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

于 2012-11-30T21:28:34.750 回答