Rails错误消息

时间:2016-10-05 00:06:09

标签: ruby-on-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

在我的控制器中:

   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

1 个答案:

答案 0 :(得分:1)

看起来每次调用current_order时它都会重新运行find方法。您可以在日志中确认这一点,但尽量不要调用它,或者至少记住它。在实例变量中,每次都会使用相同的顺序。

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