我最近将我的数据库从sqlite3更改为Postgres,因此我可以将其启动到Heroku。因此,我对我的数据库和Gemfile进行了所有更改,然后进行了修改。 Heroku应用程序运行良好,但当我回到我的本地分支时,我会触发此错误。
Devise中的ActiveRecord :: RecordNotFound :: 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为零,则应该只创建一个新订单。如果找不到身份证,为什么会吓到它? 如你所见,我正在使用设计。以下是我的购物车相关型号:
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
提前谢谢。
答案 0 :(得分:3)
在本地,您的会话仍将order_id
密钥设置为2
。这就是您的代码通过if-check并进入Order.find
调用的原因。它爆炸的原因是因为find
的默认行为现在是提升ActiveRecord :: RecordNotFound,如果它找不到匹配的记录。
现在,这可能也是您网站的正确行为。如果会话以某种方式与不存在的订单相关联,那么您将处于不一致的状态!我认为您现在正在看到这一点,因为您重建了数据库,擦除了与您的会话相关联的订单记录,但尚未清除您的会话。如果您这样做(例如,通过删除localhost域的所有cookie,或完全关闭浏览器并重新打开它),错误就会消失。
答案 1 :(得分:0)
找不到'id'= 2
的订单
错误是因为 本地数据库 中的Order
没有id = 2
条记录,可能会有 order_items在order_id = 2
表格中输入>儿童记录 。因此,session[:order_id]
不会 nil ,并且会找到Order
的{{1}}记录,但不存在。
原因可能是因为id = 2
Order
记录可能会被意外删除。要快速解决问题,请尝试清除所有Cookie或尝试使用id = 2
删除order_items
记录,并确保每个order_id = 2
记录都包含与对应的正确order_items
现有订单记录 。
答案 2 :(得分:0)
如前所述,清除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
结束