2 Stimmen

Rails Validierung virtueller Attribute

Mein Modell sieht folgendermaßen aus:

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

Meine Fragen 1. Wie schreibe ich richtig eine Getter-Methode item_location definiert? 2. Wie kann ich das Feld item_location validieren. Ich habe die Methode validate_item_location erstellt, weiß aber nicht, wie ich die Variable item_location abrufen kann, wenn ich Daten über mein Formular POSTe. 3. Ist meine Setter-Methode in Ordnung?

THX!

3voto

Veger Punkte 35866

1) Ein Gegenstand kann viele Standorte haben? Es scheint (mir), dass er nur einen haben sollte, also ändere hasy_many a has_one . Es sei denn, Sie wollten wirklich mehrere Standorte haben, dann müssen Sie die item_location um einen Ort aus der Liste auszuwählen, die Sie haben.

2 & 3) Wenn Sie Ihre Daten über ein Formular POSTen, wird der item_location von der item_location= Methode. Diese sollte (irgendwie) die Artikelinformationen speichern. In Ihrem Fall speichert sie die Koordinaten, die von der Methode geo variabel. Sie sollten einen Fehler auslösen, wenn geo.success ist false, um dem Benutzer mitzuteilen, dass der Wert nicht gespeichert wurde. Wenn Sie speziell den an den Setter gesendeten Wert validieren wollen, müssen Sie ihn in der Klasse speichern: @saved_location = str und verwenden @saved_location anstelle von item_location zu validieren.

1 & 3) Im Allgemeinen ist es üblich, dass ein Setter und ein Getter die gleichen Daten (Struktur) verwenden. In Ihrem Fall speichern Sie die Koordinaten der Position in Ihrem Setter, geben aber die Adresse, Stadt und Land zurück. Der Setter und der Getter scheinen also nicht kompatibel zu sein.

Ich hoffe, diese Bemerkungen sind hilfreich!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X