Rails Проверка виртуальных атрибутов - PullRequest
2 голосов
/ 14 января 2010

Моя модель выглядит так:

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. Как правильно написать метод get_location? 2. Как я могу проверить поле item_location. Я создал метод validate_item_location, но не знаю, как получить переменную item_location, когда я отправляю данные через форму. 3. Мой метод установки подходит?

THX!

1 Ответ

3 голосов
/ 14 января 2010

1) Предмет может иметь много мест? Мне кажется, что он должен быть только один, поэтому измените hasy_many на has_one. Если вы действительно не хотели иметь несколько местоположений, вам нужно изменить item_location, чтобы выбрать одно местоположение из списка, который у вас есть.

2 & 3) Если вы отправляете свои данные через форму, item_location устанавливается методом item_location=. Который должен (как-то) хранить информацию об элементе. В вашем случае он хранит координаты, возвращенные из переменной geo. Вы должны вызвать некоторую ошибку, когда geo.success имеет значение false, чтобы уведомить пользователя о том, что значение не было сохранено. Если вы специально хотите проверить значение, отправленное в установщик, вам нужно сохранить его в классе: @saved_location = str и использовать @saved_location для проверки вместо item_location.

1 & 3) Как правило, практика, когда сеттер и геттер используют одни и те же данные (структуру). В вашем случае вы сохраняете координаты положения в сеттере, но возвращаете адрес, город и страну. Таким образом, сеттер и геттер кажутся несовместимыми.

Надеюсь, эти замечания помогут!

...