Как проверить соответствие объекта «в памяти» по сравнению с сохраненным объектом в базе данных - PullRequest
0 голосов
/ 02 декабря 2010

Следующий код прекрасно работает при создании «каналов», имеющих адреса, такие как электронные письма или телефоны.

class Channel < ActiveRecord::Base
  belongs_to :contact
  belongs_to :mechanism

  validates_uniqueness_of :address
  validates_format_of :address, :with => /@/i,
    :if => :address_is_email?
  validates_format_of :address, :with => /\d\d\d\d\d\d\d\d\d\d/,
    :if => :address_is_phone?

  def before_validation
    self.address = address.gsub(/[^0-9]/, "") if mechanism.designation == "sms"
  end

  def address_is_email?
    mechanism.designation == "smtp"
  end

  def address_is_phone?
    mechanism.designation == "sms"
  end
end

Вот так:

>> c = Channel.create(:mechanism_id => 1, :address => 'something@someplace.com')
=> #<Channel id: 17, created_at: "2010-12-02 15:00:59", updated_at: "2010-12-02 15:00:59", mechanism_id: 1, contact_id: nil, address: "something@someplace.com", enabled: nil, time_window_id: nil>
>> c.save
=> true

Однако, если я попытаюсь изменить формат с одного на другой по факту, произойдет сбой.

>> c.update_attributes(:address => '888.555.1212', :mechanism_id => 2)
=> false
>> c.save
=> false

Я предполагаю, что это потому, что validates_format_of проходит через address_is_ *? функция и чтение по формату, который хранится в базе данных (или уже в памяти), а не по значению, которое я передаю. Как бы я протестировал новое значение, которое я (как-то) передаю классу, когда я пытаюсь выполнить update_attributes? Единственное, что я могу сделать, учитывая приведенный выше код, это удалить канал и создать новый в другом формате.

1 Ответ

1 голос
/ 02 декабря 2010

Ваша проблема с этой строкой:

validates_format_of :address, :with => /\d\d\d\d\d\d\d\d\d\d/,
    :if => :address_is_phone?

Регулярное выражение ожидает 10 цифр, между которыми нет ничего!Если вам нужны точки, как в приведенном выше примере, сделайте это следующим образом:

validates_format_of :address, :with => /\d\d\d\.\d\d\d\.\d\d\d\d/,
    :if => :address_is_phone?

И, конечно, оттуда вы можете получить все, что захотите.Надеюсь, это поможет!

PS: Это более короткая и удобная для чтения версия:

validates_format_of :address, :with => /\d{3}\.\d{3}\.\d{4}/,
    :if => :address_is_phone?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...