Следующий код прекрасно работает при создании «каналов», имеющих адреса, такие как электронные письма или телефоны.
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? Единственное, что я могу сделать, учитывая приведенный выше код, это удалить канал и создать новый в другом формате.