簡體   English   中英

找不到“ id” = 2的訂單

[英]Couldn't find Order with 'id'=2

我最近將數據庫從sqlite3更改為Postgres,因此可以將其啟動到Heroku。 因此,我對數據庫和Gemfile進行了所有更改,並啟動了。 Heroku應用程序運行良好,但是當我返回本地分支時,會觸發此錯誤。

ActiveRecord :: RecordNotFound在Devise :: SessionsController#new中

找不到“ id” = 2的訂單

def current_order
   if !session[:order_id].nil?
      Order.find(session[:order_id])
   else
      Order.new
   end

這讓我感到困惑,因為a)Heroku應用程序再次運行良好。 b)因為該條件清楚地表明,如果訂單ID為nil,則應該重新下訂單。 如果找不到ID,為什么會驚慌失措? 如您所見,我正在使用devise。 這是與購物車相關的型號:

class CartsController < ApplicationController
  def show
    @order_items = current_order.order_items
  end
end


class OrderItemsController < ApplicationController
  def create
    @order = current_order
    @order_item = @order.order_items.new(order_item_params)
    @order.save
    session[:order_id] = @order.id
  end

  def update
    @order = current_order
    @order_item = @order.order_items.find(params[:id])
    @order_item.update_attributes(order_item_params)
    @order_items = @order.order_items
  end

  def destroy
    @order = current_order
    @order_item = @order.order_items.find(params[:id])
    @order_item.destroy
    @order_items = @order.order_items
  end
private
  def order_item_params
    params.require(:order_item).permit(:quantity, :subproduct_id)
  end
end

和模型:

class Order < ActiveRecord::Base
  belongs_to :order_status
  has_many :order_items
  before_create :set_order_status
  before_save :update_subtotal

  def subtotal
    order_items.collect { |oi| oi.valid? ? (oi.quantity * oi.unit_price) : 0 }.sum
  end
private
  # Sets order status of 1, in progress.
  def set_order_status
    self.order_status_id = 1
  end

  def update_subtotal
    self[:subtotal] = subtotal
  end
end




class OrderItem < ActiveRecord::Base
  belongs_to :subproduct
  belongs_to :order

  validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0 }
  validate :subproduct_present
  validate :order_present

  before_save :finalize


  # Will use the associated subproduct's price if the order item is not persisted
  def unit_price
    if persisted?
      self[:unit_price]
    else
      subproduct.price
    end
  end

  def total_price
    unit_price * quantity
  end

private
  def subproduct_present
    if subproduct.nil?
      errors.add(:subproduct, "is not valid or is not active.")
    end
  end

  def order_present
    if order.nil?
      errors.add(:order, "is not a valid order.")
    end
  end

  def finalize
    self[:unit_price] = unit_price
    self[:total_price] = quantity * self[:unit_price]
  end
end




class OrderStatus < ActiveRecord::Base
    has_many :orders
end

先感謝您。

在本地,您的會話仍將order_id密鑰設置為2 這就是為什么您的代碼通過if-check並進入Order.find調用的原因。 之所以炸毀它,是因為find的默認行為是如果找不到匹配的記錄,則會引發ActiveRecord :: RecordNotFound。

現在,這可能也是您網站的正確行為。 如果以某種方式將會話綁定到不存在的訂單,則您將處於不一致狀態! 我想您現在看到了這是因為您重建了數據庫,擦除了會話綁定到的訂單記錄,但是還沒有清除會話。 如果這樣做(例如,通過刪除本地主機域的所有cookie,或完全關閉瀏覽器並重新打開),該錯誤將消失。

找不到“ id” = 2的訂單

該錯誤是因為本地數據庫中沒有id = 2 Order記錄,而order_items表中可能有一個order_id = 2子記錄 因此session[:order_id]不會為nil ,它將找到id = 2Order記錄不存在。

原因可能是因為id = 2Order記錄可能被意外刪除。 為了快速解決,請嘗試清除所有cookie或嘗試刪除order_id = 2order_items記錄,並確保每個order_items記錄都具有與現有訂單記錄對應的正確order_id

如您所知,清除cookie可能會導致問題。 您也可以這樣做。 它的作用是檢查cookie中找到的訂單是否仍然可用,如果沒有,它將重置它,然后創建一個新的而不拋出錯誤。

def current_order
if !session[:order_id].nil?
  @find_order = Order.find(session[:order_id]) rescue nil
  if !@find_order
    session[:order_id] = nil
    current_order
  elsif @find_order.order_status_id != 1
    session[:order_id] = nil
    current_order
  else
    Order.find(session[:order_id])
  end
else
  Order.new
end

結束

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM