【问题标题】:Couldn't find Order with 'id'=2找不到“id”=2 的订单
【发布时间】:2015-10-16 07:01:42
【问题描述】:

我最近将我的数据库从 sqlite3 更改为 Postgres,因此我可以将它启动到 Heroku。因此,我对我的数据库和 Gemfile 进行了所有更改,然后启动了。 Heroku 应用运行良好,但是当我返回本地分支时,我触发了此错误。

ActiveRecord::RecordNotFound in 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,为什么会发疯? 如您所见,我正在使用设计。这是我与购物车相关的模型:

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

提前谢谢你。

【问题讨论】:

  • 您的本地数据库中是否有Orderid = 2 的记录?
  • 感谢您的回复。控制台告诉我我没有。但我不明白为什么它甚至应该搜索它。
  • 这是因为在您的order_items 表中可能有order_id = 2 的记录。请检查。

标签: ruby-on-rails devise shopping-cart


【解决方案1】:

如您所说,清除 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

结束

【讨论】:

    【解决方案2】:

    找不到 'id'=2 的订单

    错误是因为在您的本地数据库中没有带有id = 2Order 记录,并且可能存在子记录 在您的order_items 表中使用order_id = 2。所以session[:order_id] 不会是nil,它会找到不存在的Order 记录和id = 2

    原因可能是因为带有id = 2Order 记录可能被意外删除。为了快速修复,请尝试清除所有 cookie 或尝试使用order_id = 2 删除order_items 记录,并确保每个order_items 记录都有一个正确的order_id,对应于现有订单记录 em>

    【讨论】:

    • 也感谢您,先生。愿你也有一个满意的星期六。
    【解决方案3】:

    在本地,您的会话仍将order_id 键设置为2。这就是您的代码通过 if-check 并到达 Order.find 调用的原因。它爆炸的原因是因为find 的默认行为现在是在找不到匹配记录时引发 ActiveRecord::RecordNotFound。

    现在,这可能也是您网站的正确行为。如果会话以某种方式与不存在的订单相关联,那么您将处于不一致的状态!我认为您现在看到了这一点,因为您重建了数据库,擦除了与您的会话相关的订单记录,但尚未清除您的会话。如果您这样做(例如,通过删除 localhost 域的所有 cookie,或完全关闭浏览器并重新打开它),错误就会消失。

    【讨论】:

      猜你喜欢
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多