找不到 'id'=2 的订单
Couldn't find Order with 'id'=2
我最近将我的数据库从 sqlite3 更改为 Postgres,这样我就可以将它启动到 Heroku。因此,我对我的数据库和 Gemfile 进行了所有更改,然后启动了。 Heroku 应用程序运行良好,但当我返回本地分支机构时,我触发了此错误。
Devise::SessionsController#new
中的 ActiveRecord::RecordNotFound
找不到 'id'=2
的订单
def current_order
if !session[:order_id].nil?
Order.find(session[:order_id])
else
Order.new
end
这让我感到困惑,因为 a) Heroku 应用程序再次运行良好。和 b) 因为条件清楚地表明如果订单 ID 为零,它应该只下一个新订单。如果它找不到 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,或完全关闭浏览器并重新打开),错误将消失。
Couldn't find Order with 'id'=2
错误是因为在你的local DB中没有Order
记录id = 2
并且有可能是您 order_items
table 和 order_id = 2
中的 子记录 。所以 session[:order_id]
不会是 nil 并且它会找到带有 id = 2
的 Order
记录不存在。
原因可能是 Order
条带 id = 2
的记录可能被不小心删除了。为了快速修复,请尝试清除所有 cookie 或尝试使用 order_id = 2
删除 order_items
记录,并确保每个 order_items
记录都有一个正确的 order_id
对应于 [=32] =]已有订单记录.
如您所知,清除 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
结束
我最近将我的数据库从 sqlite3 更改为 Postgres,这样我就可以将它启动到 Heroku。因此,我对我的数据库和 Gemfile 进行了所有更改,然后启动了。 Heroku 应用程序运行良好,但当我返回本地分支机构时,我触发了此错误。
Devise::SessionsController#new
中的 ActiveRecord::RecordNotFound找不到 'id'=2
的订单def current_order
if !session[:order_id].nil?
Order.find(session[:order_id])
else
Order.new
end
这让我感到困惑,因为 a) Heroku 应用程序再次运行良好。和 b) 因为条件清楚地表明如果订单 ID 为零,它应该只下一个新订单。如果它找不到 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,或完全关闭浏览器并重新打开),错误将消失。
Couldn't find Order with 'id'=2
错误是因为在你的local DB中没有Order
记录id = 2
并且有可能是您 order_items
table 和 order_id = 2
中的 子记录 。所以 session[:order_id]
不会是 nil 并且它会找到带有 id = 2
的 Order
记录不存在。
原因可能是 Order
条带 id = 2
的记录可能被不小心删除了。为了快速修复,请尝试清除所有 cookie 或尝试使用 order_id = 2
删除 order_items
记录,并确保每个 order_items
记录都有一个正确的 order_id
对应于 [=32] =]已有订单记录.
如您所知,清除 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
结束