ruby-on-rails - Rails 验证虚拟属性

标签 ruby-on-rails validating virtual-attribute

我的模型如下所示:

class Item < ActiveRecord::Base
  has_many :locations
  validate :validate_item_location

  def item_location
    locations.address+','+locations.city+','+locations.country
  end

  def item_location=(str)
    geo = Geokit::Geocoders::MultiGeocoder.geocode(str)
    if geo.success
      locations.build( :lat => geo.lat, :lng => geo.lng)
    end
  end

  def validate_item_location
    geo = Geokit::Geocoders::MultiGeocoder.geocode( item_location )
    errors.add_to_base("Location is invalid") unless geo.success
  end
end

我的问题 1.如何正确编写item_location定义的getter方法? 2. 如何验证 item_location 字段。我创建了 validate_item_location 方法,但不知道当我通过表单发布数据时如何在内部获取 item_location 变量。 3.我的setter方法可以吗?

谢谢!

最佳答案

1) 一个项目可以有多个位置? (在我看来)它应该只有一个,因此将 hasy_many 更改为 has_one。除非您确实想要拥有多个位置,否则您需要更改 item_location 以从您拥有的列表中选择一个位置。

2 & 3) 如果您通过表单发布数据,则 item_location 将由 item_location= 方法设置。哪个应该(以某种方式)存储项目信息。在您的情况下,它存储从 geo 变量返回的坐标。当 geo.success 为 false 时,您应该引发一些错误以通知用户该值未存储。如果您特别想验证发送到 setter 的值,那么您需要将其存储在类中:@saved_location = str 并使用 @saved_location 进行验证,而不是项目位置。

1 & 3) 通常情况下,setter 和 getter 使用相同的数据(结构)。在您的情况下,您将位置的坐标存储在 setter 中,但返回地址、城市和国家/地区。因此 setter 和 getter 似乎是不兼容的。

希望这些言论对您有所帮助!

关于ruby-on-rails - Rails 验证虚拟属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2063704/

相关文章:

jquery - rails : Saving an ordered list with empty values

vb.net - 防止在自定义文本框中触发验证/验证事件 - vb.net

ruby-on-rails - 使用 Sinatra 和 Datamapper 的虚拟属性

ruby-on-rails - Rails 4中的虚拟属性

ruby-on-rails - 如何使用 Capybara 确认 javascript 弹出窗口?

ruby-on-rails - rails 4 : testing GET request on a namespaced controller

ruby-on-rails - 使用 Devise in Rails 4 的虚拟属性

ruby-on-rails - 来自 postgresql 的 Rails 自动轮毫秒查询

c# - 单击按钮时在表单上运行所有验证事件