这个让我感到困惑。我仍然是Rails的新手,所以它可能很简单。
情况:
我正在使用Devise所以我不确定这是否与它有关,或者行项目删除方法是级联删除会话或类似的东西。
问题是,在调用line_item delete之后,是否有人可以帮助我理解为什么会话变量变为空?
我已经创建了一个购物车应用程序,以及使用rails的Agile Web开发。首先,这是应用程序控制器检索当前购物车的代码:
private
def current_cart
Checkout::Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
cart = Checkout::Cart.create
session[:cart_id] = cart.id
cart
end
现在是我的订单项控制器的代码
class Checkout :: LineItemsController< ApplicationController中
#POST / checkout / line_items #POST /checkout/line_items.json def 创建
@cart = current_cart product = Catalog::Product.find(params[:product_id]) apparel_event_log.info (product.to_json) @checkout_line_item = @cart.line_items.find_or_initialize_by_sku_id(product.part_number) new_quantity = @checkout_line_item.quantity || 0 @checkout_line_item.quantity = new_quantity+1 @checkout_line_item.line_item_description = product.name @checkout_line_item.image = product.primary_image respond_to do |format| if @checkout_line_item.save format.html { redirect_to @checkout_line_item.cart, notice: 'Line item was successfully created.' } format.json { render json: @checkout_line_item, status: :created, location: @checkout_line_item } else format.html { render action: "new" } format.json { render json: @checkout_line_item.errors, status: :unprocessable_entity } end end end
#DELETE / checkout / line_items / 1#DELETE /checkout/line_items/1.json def destroy 结帐:: LineItem.delete(PARAMS [:ID])
respond_to do |format| format.html { redirect_to current_cart, notice: 'Line item removed.' } format.json { head :no_content } end end end
以及订单项模型的代码
class Checkout::LineItem < ActiveRecord::Base
before_save :default_values
attr_accessible :customer_update_date, :inventory_status, :line_item_color, :line_item_description, :line_item_size, :line_item_tagline, :line_item_total, :image, :quantity, :sku_id, :style_id, :tax, :tax_code, :timestamps, :unit_price, :cart, :product
belongs_to :cart
belongs_to :product, :class_name => 'Catalog::Product'
has_one :image, :class_name => 'Assets::Medium'
def default_values
Rails.logger.debug { "Entering default values" }
self.quantity ||= 0
end
end
答案 0 :(得分:0)
首先,您应该将逻辑移到模型中:
class Cart << AR
def add(product_id)
product = Catalog::Product.find(product_id)
if item = self.line_items.find_or_initialize_by_sku_id(product.part_number)
item.quantity = (item.quantity || 0) + 1
item.line_item_description = product.name
item.image = product.primary_image
return item.save
end
end
end
class Checkout::LineItemsController < ApplicationController
# POST /checkout/line_items # POST /checkout/line_items.json def create
@cart = current_cart
apparel_event_log.info (product.to_json)
respond_to do |format|
if @checkout_line_item = @cart.add(params[:product_id])
format.html { redirect_to @checkout_line_item.cart, notice: 'Line item was successfully created.' }
format.json { render json: @checkout_line_item, status: :created, location: @checkout_line_item }
else
format.html { render action: "new" }
format.json { render json: @checkout_line_item.errors, status: :unprocessable_entity }
end
end
end
其次你应该添加开头:
private
def current_cart
begin
Checkout::Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
cart = Checkout::Cart.create
session[:cart_id] = cart.id
cart
end
end
答案 1 :(得分:0)
好的,我实际上已经设法解决了这个问题。那很难!
使用link_to ...:destroy或delete似乎是某种问题,我认为默认的rails代码没有产生CSRF保护,因此会话无效。
我已经通过用button_to替换link_to来解决主要部分,以删除订单项,这似乎有效,至少在功能上。
我真的更喜欢使用链接而不是按钮。这似乎是一个更常见的问题,所以我会在论坛上寻找答案,但是如果你知道答案,请欣赏你是否可以直接在这个帖子上发布链接或答案。