我今天遇到了一个我以前没有见过的问题 - 我有一个自定义验证来检查我的订单模型中是否已使用折扣代码:
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
在我的控制器中:
if current_order.update_attributes(discount_code: params[:coupon_code].downcase, another_attribute: other_stuff)
....
session[:order_id] = nil
render json: { charged: 'true' }.as_json
else
puts "==============="
puts current_order.id # shows the correct current order ID
puts current_order.errors.full_messages # shows that there are no errors present
puts "==============="
render json: { charged: 'false', errors: current_order.errors.full_messages }.as_json
end
所以它看起来像在update_attributes,它运行验证,验证失败,创建错误消息,然后一旦它回到我的控制器,错误消息就消失了。我很难理解导致这个问题的原因。
编辑:
以下是current_order:
在ApplicationController.rb中:
def current_order
session[:order_id].present? ? Order.find(session[:order_id]) : Order.new
end
答案 0 :(得分:1)
看起来每次调用current_order时它都会重新运行find方法。您可以在日志中确认这一点,但尽量不要调用它,或者至少记住它。在实例变量中,每次都会使用相同的顺序。
def current_order
@current_order ||= (Order.find_by_id(session[:order_id]) || Order.new)
end