2016-10-05 5 views
0

я столкнулся вопросом сегодня я не видел - у меня есть пользовательская проверка, чтобы проверить, если код скидки уже используется в моей модели заказа:Сообщения об ошибках Rails

validate :valid_discount_code 

def valid_discount_code 
    is_valid = false 
    code = nil 

    if discount_code.present? 

    if discount_code.try(:downcase) == 'xyz' 
     code = 'xyz' 
     is_valid = true 
    else 
     code = Coupon.find_by_coupon_code(discount_code) 
     is_valid = code.present? 
    end 

    if code.nil? 
     is_valid = false 
     errors.add(:discount_code, "is not a valid referral code") 
    elsif (code.present? && Coupon.where(email: email, coupon_code: code).present?) 
     is_valid = false 
     errors.add(:discount_code, "has already been used.") 
    end 


    puts "------------" 
    puts errors.full_messages ## successfully 'puts' the correct error message into my console. 
    puts "------------" 

    if is_valid 
    .... do stuff..... 
    end 

    end 

end 

В моем контроллере:

Таким образом, это похоже на update_attributes, оно выполняет проверку, не выполняет проверку, создает сообщение об ошибке, а затем, когда оно вернулось на мой контроллер, сообщение об ошибке исчезло. Я в тупике, что может быть причиной этой проблемы.

EDIT:

Вот что current_order является:

В ApplicationController.rb:

def current_order 
    session[:order_id].present? ? Order.find(session[:order_id]) : Order.new 
end 
+1

Что такое 'current_order'? Это переменная или метод? Вы можете проверить это на консоли и подтвердить, что все это в контроллере. – Swards

+0

@swards current_order - это метод в моем контроллере приложений, я включу этот метод в редактирование выше – asalgan

+0

. Еще одна потенциальная проблема - это «params [: coupon_code] .downcase» пустым? – Swards

ответ

1

Похоже, каждый раз, когда вы называете current_order он вновь запускает поисковый метод. Вы можете подтвердить это в журналах, но постарайтесь не называть это или, по крайней мере, мнимать его. В переменной экземпляра один и тот же порядок будет использоваться каждый раз.

def current_order 
    @current_order ||= (Order.find_by_id(session[:order_id]) || Order.new) 
end 
+0

Удивительный! Это была проблема, спасибо тонну! – asalgan

Смежные вопросы