2013-05-23 8 views
6

OK, to nie ma sensu. Mogę dodać błąd do modelu, ale kiedy wywołuję poprawny? lub zapisać! usuwa błąd, który dodałem. Jednak regularne sprawdzanie poprawności uniemożliwi zapisanie modelu. Dlaczego nie działa błąd.add?Dodawanie błędów do modelu w szynach nie działa

1.9.3p0 :001 > @order = Order.new(email: '[email protected]') 
=> #<Order id: nil, name: nil, address: nil, email: "[email protected]", pay_type: nil, created_at: nil, updated_at: nil, paypal_customer_token: nil, paypal_recurring_profile_token: nil, first_name: nil, last_name: nil, account_details: {}, unit_id_for_plan: nil, invoice: nil, purchased_at: nil> 
1.9.3p0 :002 > @order.valid? 
=> true 
1.9.3p0 :003 > @order.errors.add :base, 'error' 
=> ["error"] 
1.9.3p0 :004 > @order.errors.size 
=> 1 
1.9.3p0 :005 > @order.valid? 
=> true 
1.9.3p0 :006 > @order.errors.size 
=> 0 
1.9.3p0 :007 > @order.errors.add :base, 'error_again' 
=> ["error_again"] 
1.9.3p0 :008 > @order.errors.size 
=> 1 
1.9.3p0 :009 > @order.save! 
    (0.1ms) BEGIN 
    SQL (0.3ms) INSERT INTO `orders` (`account_details`, `address`, `created_at`, `email`, `first_name`, `invoice`, `last_name`, `name`, `pay_type`, `paypal_customer_token`, `paypal_recurring_profile_token`, `purchased_at`, `unit_id_for_plan`, `updated_at`) VALUES ('--- {}\n', NULL, '2013-05-23 18:17:18', '[email protected]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2013-05-23 18:17:18') 
    (12.6ms) COMMIT 
=> true 
1.9.3p0 :010 > @order.errors.size 
=> 0 

Model Zamówienie nie zawiera dużo Walidacja:

attr_accessible :address, :email, :name, :pay_type, :paypal_customer_token, :paypal_payment_token, :first_name, :last_name, :account_details, :invoice 
    has_one :cart 
    has_many :line_items, :through => :cart 
    has_many :products, :through => :line_items, :source => :sellable, :source_type => 'Product' 
    has_many :airtime_plans, :through => :line_items, :source => :sellable, :source_type => 'AirtimePlan' 
    has_many :payment_notifications 

    serialize :account_details, Hash 

    validates_presence_of :email 

validates_presence_of: email poprawnie uniemożliwi Zapisz z pracy, ale kiedy używam errors.add: podstawa, to nie działa .

@LeoCorrea odpowiedź doprowadziła mnie do wystąpienia z tego rozwiązania:

validate :user_validation, :on => :create 
attr_accessor :users_invalid 

def user_validation 
    if users_invalid 
    errors[:base] << "You have invalid user records" 
    end 
end 

#paypal_payment model in which the order is passed into 
elsif resp["status"] == "error" 
    #@order.errors.add(:base, resp["body"]) 
    @order.users_invalid = true 
end 

Problem jest rzeczywisty komunikat chcę jest w odp [ „ciała”]. Właśnie dodałem nieprzydatny komunikat "Masz niepoprawne rekordy użytkownika".

+1

musimy swój pełny 'metody save_with_payment' myślę – Ven

+0

@ user1737909 dodałem metody pełnej – JohnMerlino

+0

i twoi weryfikatorów ... Jedno zauważyłem jednak, w swoich metodach używasz' zaoszczędzić! ', Która zgłasza wyjątek przy błędzie, zamiast 'save', który zwraca true/false. Ale myślę, że to jest drugorzędne, najpierw sprawdziłbym twoje walidacje. – dpassage

Odpowiedz

5

valid? w modelu AR usuwa tablicę błędów, nie sprawdza, czy występują błędy w tablicy błędów, czy nie. Jeśli chodzi o save!, działa sprawdzanie poprawności, które nie ma nic wspólnego z tablicą błędów. Jeśli chcesz mieć błędy w swoim modelu, musisz dodać do niego weryfikacje.

Jeśli czytasz kod dla valid? To co zobaczysz

ActiveRecord :: walidacji

def valid?(context = nil) 
    context ||= (new_record? ? :create : :update) 
    output = super(context) 
    errors.empty? && output 
end 

Wezwanie super(context) jest właśnie wezwanie do ActiveModel::Validations#valid? który jest odpowiedzialny do wyczyszczenia tablicy błędów przed uruchomieniem sprawdzania poprawności:

ActiveModel :: Validations

def valid?(context = nil) 
    current_context, self.validation_context = validation_context, context 
    errors.clear 
    run_validations! 
ensure 
    self.validation_context = current_context 
end 

UPDATE

Aby dodać swoje własne błędy, trzeba to zrobić na metodzie walidacji który dodaje go po sprawdzeniu poprawności. Coś przed lub po zostanie wyczyszczone po ponownym uruchomieniu walidacji.

Spójrz na tego zasobu http://guides.rubyonrails.org/active_record_validations.html#errors

Błędy są dodawane metody, która jest wywoływana z walidacji.

+0

ok, ponieważ muszę dodać błąd w zupełnie innym modelu, to znaczy, że muszę utworzyć attr_accessor i ustawić go na true. Następnie utwórz niestandardową weryfikację i sprawdź, czy attr_accessor ma wartość true, a jeśli true, to dodaj do błędów [: base]. Wciąż jednak w tym punkcie pojawia się problem, nie wiem, jakie są rzeczywiste komunikaty o błędach. – JohnMerlino

+0

Nie podążam za tobą ... w jakim przypadku musiałbyś dodać błąd z innego modelu? To po prostu sprawi, że te dwa modele będą ściśle powiązane. –

+0

Co dokładnie należy zrobić lub w jakim przypadku należy dodać błędy? Zaktualizuj swoją odpowiedź, aby odpowiedzieć na to pytanie. –

Powiązane problemy