Несколько вопросов о модели Rails для простого приложения адресной книги - PullRequest
0 голосов
/ 16 марта 2010

У меня есть приложение Rails, которое перечисляет информацию о локальных сервисах. Мои цели для этой модели следующие: 1. Заполнить поля name и tag_list. 2. Заполните одно или несколько полей для бесплатного телефона, телефона, телефона2, мобильного телефона, факса, электронной почты или веб-сайта. 3. Если поле paddress имеет значение, закодируйте его с помощью плагина Geokit. Вот моя модель entry.rb:

class Entry < ActiveRecord::Base

  validates_presence_of :name, :tag_list
  validates_presence_of :tollfreephone or :phone or :phone2 or :mobile or :fax or :email or :website
  acts_as_taggable_on :tags
  acts_as_mappable :auto_geocode=>{:field=>:paddress, :error_message=>'Could not geocode physical address'}

  before_save :geocode_paddress
  validate :required_info

  def required_info
    unless phone or phone2 or tollfreephone or mobile or fax or email or website
      errors.add_to_base "Please have at least one form of contact information."
    end
  end

  private
  def geocode_paddress
    #if paddress_changed?
    geo=Geokit::Geocoders::MultiGeocoder.geocode (paddress)
    errors.add(:paddress, "Could not Geocode address") if !
geo.success
    self.lat, self.lng = geo.lat,geo.lng if geo.success
    #end 
  end
end

Требуется работа с именем и tag_list, но не требуется одно (или более) из полей tollfreephone, phone, phone2, mobile, fax, email или website.

Что касается кодирования с Geokit, чтобы сохранить запись с моделью, я должен ввести адрес. Какое поведение я не хочу. Я бы хотел, чтобы оно не требовало поля paddress, но если поле paddress имеет значение, оно должно кодировать геокод. Как есть, он всегда пытается геокодировать входящую запись. Закомментированное "если paddress_changed?" не работал, и я не мог найти что-то вроде "если paddress_exists?" это будет работать.

Помощь с любым из этих вопросов будет принята с благодарностью. Я опубликовал три вопроса, относящихся к моей модели, потому что я не уверен, мешают ли они друг другу работать. Спасибо за чтение моих вопросов.

Ответы [ 2 ]

3 голосов
/ 16 марта 2010

Я вижу следующие проблемы в вашем коде:

1) Дубликаты проверок присутствия

2) Автоматическое и ручное геокодирование одновременно.

Вот версия вашего кода, которая может работать:

class Entry < ActiveRecord::Base

  acts_as_mappable 
  acts_as_taggable_on   :tags

  validates_presence_of :name, :tag_list
  validate              :required_info

  before_save           :geocode_paddress


private

  def required_info
    if( phone.empty?  and phone2.empty? and tollfreephone.empty? and 
        mobile.empty? and fax.empty?    and email.empty?         and 
        website.empty? 
      ) 
      errors.add_to_base "Please have at least one form of contact information."
    end
  end


  def geocode_paddress
    # if paddress is nil or empty set the old values to nil and return    
    ((self.lat = self.lng = nil); return true) if paddress.empty?
    g=Geokit::Geocoders::MultiGeocoder.geocode(paddress)
    (errors.add(:paddress,"Could not Geocode address");
       return false) unless g.success
    self.lat, self.lng = g.lat, g.lng
  end
end

Редактировать

Проверка required_info завершается неудачно, поскольку входные данные, представленные в форме, содержат пустые строки для пропущенных полей, а не нулевые значения. Следовательно, проверка phone or phone2 etc. всегда возвращала true. Я изменил код проверки, чтобы устранить этот крайний случай. Я совершенно уверен, что теперь это сработает.

PS: Это типичный сценарий, когда вы должны использовать отладчик. Скачайте и играйте с любой бесплатной IDE, такой как Aptana Radrails ИЛИ Netbeans. Когда вы ознакомитесь с этим инструментом, вы сможете легко отлаживать такие проблемы.

0 голосов
/ 16 марта 2010

У меня нет рубина, но я уверен, что вы не можете сделать это с помощью validates_presence_of.

Вам нужно будет сделать что-то вроде:

validates_presence_of: бесплатный телефон,: разве что => some_method_to_tell_if_other_methods_are_there

Что касается метода геокодера, может просто проверить, равен ли он нулю? Что-то вроде:

def geocode_paddress
    if paddress != nil
        geo = Geokit::Geocoders::MultiGeocoder.geocode (paddress)
        if geo.success
           self.lat, self.lng = geo.lat,geo.lng
        else
           errors.add(:paddress, "Could not Geocode address")
        end
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...