23 Jun Customizable Validations on Rails Models
In this example let’s use factory_girl gem and rspec rails gem for test suite:
First our tests:
We need the next two factories:
factories/invoice.rb
FactoryGirl.define do factory :invoice do association :admin folio 222 signature "xx94108" total 3400.09 subtotal 500.50 tipo_comprobante 'Factura' end end
factories/admin.rb
FactoryGirl.define do
factory :admin do
stamp = Time.now.to_i
email = "user+#{stamp}@email.com"
password "12345679"
password_confirmation "12345679"
email email
nombre "Jose heriberto"
apellidos "Perez Maga"
razon_social "Mi Compu S.A. de C.V."
rfc 'PEMH87022ES3'
fecha_vencimiento_suscripcion Time.now - 1.day
numero_folios_validos 20
end
end
spec/models/invoice_spec.rb
require 'spec_helper'
describe Invoice do
describe '#validate_unique_folio_number' do
let(:admin_user) { FactoryGirl.create :admin, id: 1234}
context 'when the user input a unique folio number' do
subject { FactoryGirl.create(:invoice, :admin => admin_user, folio: 333) }
specify do
subject.should have(0).error_on(:folio)
end
end
context 'when the user input a not unique folio number' do
let(:invoice_2) { FactoryGirl.create(:invoice, :admin => admin_user, folio: 333) }
before do
FactoryGirl.create(:invoice, :admin => admin_user, folio: 333)
end
specify do
#the next two lines do the same, you can select whatever you want
# if we use expect(invoice_2).should it doesn't execute lambda for that reason we use {} instead ()
expect { invoice_2.should raise_error(ActiveRecord::RecordInvalid) }
lambda {
invoice_2
}.should raise_error(ActiveRecord::RecordInvalid)
end
end
end
end
Our model: app/models.invoce.rb
class Invoice < ActiveRecord::Base
attr_accessible :folio
belongs_to :admin
validate :validate_unique_folio_number, :on => :create
def validate_unique_folio_number
user = Admin.find(self.admin_id)
record_found = Invoice.where("admin_id = ? AND folio = ?", user.id, folio)
errors.add(:folio, "add different folio number") unless record_found.empty?
end
end
No Comments