Ist das eine richtige Art und Weise ein Modell, Fabrik und Spezifikationen für ein Modell mit zwei alternativen Validierungen (weder beide haben Wert noch, beide gleich Null?Wie schreibt man Spezifikationen für ein Modell, das nur eines der beiden Attribute validiert (xor)?
Ich habe es die folgende Art und Weise sein könnte, zu schreiben, die funktioniert Recht. Allerdings ist nicht sicher, dass dies könnte die eleganteste Art und Weise tun.
model/invoice.rb
class Invoice < ActiveRecord::Base
validates :payment_term, presence: true, allow_nil: true
validates :interest_on_arrears, numericality: true, allow_nil: true
validate :choose_xor_date
private
def choose_xor_date
unless deadline.blank?^payment_term.blank?
errors.add(:base, 'specify a deadline or a payment term.
Not both empty, nor both filled')
end
end
end
model/invoice_spec.rb
RSpec.describe Invoice, type: :model do
describe 'validations' do
it 'fails validation with both deadline and payment_term filled' do
invoice_with_deadline = build(:invoice, deadline: '2016-02-20', payment_term: '')
invoice_with_payment_term = build(:invoice, deadline: '', payment_term: '2')
invoice_with_deadline_and_payment_term =
build(:invoice, deadline: '2016-02-20', payment_term: '2')
expect(invoice_with_deadline).to be_valid
expect(invoice_with_payment_term).to be_valid
expect(invoice_with_deadline_and_payment_term).to be_invalid
end
end
end
Fabriken/invoice.rb
FactoryGirl.define do
factory :invoice do
deadline "2016-02-20"
payment_term "2"
end
end
Funktionen/invoice_feature_spec.rb
# User create with parameter when creating invoice local object.
describe 'when user has invoice' do
@invoice = create(:invoice, deadline: '2016-02-20', payment_term: '')
visit invoices_path
click_link I18n.t('button.show')
end
bitten Sie Ihre Frage so klar wie möglich angeben? –
Viel klarer, danke. –