在Rails的ApplicationController中将id保存到会话不知何故不起作用

时间:2013-04-17 14:17:31

标签: ruby-on-rails session ruby-on-rails-3.2

我是rails的新手,现在正在通过“使用Ruby on Rails进行敏捷Web开发”教程。他们正在建立一个网上商店,而任务D则是关于创建一个购物车。要让LineItemsController知道放置项目的购物车,cart_id将保存在会话中:

class ApplicationController < ActionController::Base

  private
  def current_cart
    Cart.find(session[:cart_id])
  rescue ActiveRecord::RecordNotFound
    cart = Cart.create
    session[:card_id] = cart.id
    cart
  end

end

奇怪的是,这不起作用(虽然经过互联网搜索后,我觉得没有人遇到过这个问题)。 LineItemsController(&lt; ApplicationController)调用current_cart,但session [:cart_id]总是为nil,因此它会引发RecordNotFound错误并创建一个新的购物车。这导致很多购物车只包含1件商品。

奇怪的是,如果我将相同的方法放入LineItemsController类本身,一切都按预期工作!但这不是一个可接受的解决方案,因为我可能还需要在其他控制器中使用current_cart方法。无论如何,这个方法被继承有什么不同呢?

我正在使用Rails 3.2.13和Ruby 2.0.0,该教程似乎适用于Rails 3.2.0和早期版本的Ruby。从那时起有什么关于会议的变化所以我不得不做一些不同的事情???还是我错过了一些明显的东西?我不确定如果我没有得到这个基本工作正常工作的教程如何继续...


编辑
给出一些背景信息: current_cart基本上称为@cart = current_cart

class LineItemsController < ApplicationController

  #creates a line_item of a product and puts it in the cart
  def create 
    @cart = current_cart 
    product = Product.find(params[:product_id])
    @line_item = @cart.add_product(product.id)

    #...
  end     
end

1 个答案:

答案 0 :(得分:1)

您的代码中有拼写错误,您正在阅读会话[:car * t * _id]但是正在编写会话[:car * d * _id]

此外,如果您要继承您的方法,则应使用protected代替private