使用救援ActiveRecord :: RecordNotFound不会获得异常

时间:2017-06-11 19:37:58

标签: ruby-on-rails ruby-on-rails-5

我的路线档案:

Rails.application.routes.draw do

    resources :line_items

    resources :carts, param: :number

end

我的购物车型号:

class Cart < ApplicationRecord

    def to_param 
        number
    end

    has_many :line_items, dependent: :destroy

end

我的LineItem模型

class LineItemsController < ApplicationController

    before_action :set_cart, only: [:create]

    def create
       # stuff here ....
    end

    private

        def set_cart

            @cart = Cart.find(55)

        rescue ActiveRecord::RecordNotFound

            # @cart = Cart.create!

            session[:cart_number] = @cart.number

        end

end

我在before_action :set_cart

中执行此操作
def set_cart

    @cart = Cart.find_by!(number: session[:cart_number]) 

rescue ActiveRecord::RecordNotFound

    @cart = Cart.create

    session[:cart_number] = @cart.number

end

当我运行代码时,我收到了异常Couldn't find Cart的错误,并且救援部分没有发现错误,我尝试使用一般异常rescue Exception,但这并不是工作

更新

我发现错误来自我的购物车模型,我有这个:

before_create :generate_cart_number

MAX_RETRIES = 5

def generate_cart_number
   update_column :number, SecureRandom.hex(16/4).upcase
rescue ActiveRecord::RecordNotUnique => e
   @token_attempts = @token_attempts.to_i + 1
   retry if @token_attempts < MAX_RETRIES
   raise e, "Retries exhausted"
end

当我评论出这种方法时,set_cart方法中的救援工作开始起作用,我不知道这里究竟是什么问题,但它正在发挥作用!感谢大家试图帮助

1 个答案:

答案 0 :(得分:0)

我不知道你是否有设置购物车编号的方法,所以我建议改用ID。

def set_cart
  @cart = Cart.find_by(id: session[:cart_id])
  if @cart
     #Do what you want to do if it exists
  else
     @cart = Cart.create
     session[:cart_id]= @cart.id
  end
end