LineItemsController中的NoMethodError #create

时间:2011-08-04 07:08:12

标签: ruby-on-rails-3

我正在使用Agile Web Development with Rails(第4版)一书,我碰到了一段无效的代码。我努力弄清楚它为什么不起作用,但我没有成功。

背景信息

涉及以下课程:

class Cart < ActiveRecord::Base
  has_many :line_items, :dependent => :destroy
end

class LineItem < ActiveRecord::Base
  belongs_to :product
  belongs_to :cart
end

class ApplicationController < ActionController::Base
  protect_from_forgery

  private

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

现在 这是它失败的地方:

class LineItemsController < ApplicationController
  def index
    @line_items = LineItem.all`

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @line_items }
    end
  end

  # GET /line_items/1
  # GET /line_items/1.xml
  def show
    @line_item = LineItem.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @line_item }
    end
  end

  # GET /line_items/new
  # GET /line_items/new.xml
  def new
    @line_item = LineItem.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @line_item }
    end
  end

  # GET /line_items/1/edit
  def edit
    @line_item = LineItem.find(params[:id])
  end

  # POST /line_items
  # POST /line_items.xml
  def create
    @cart = current_cart
    product = Product.find(params[:product_id])
    @line_item = **@cart.line_items.build(:product => product)**`

错误消息 * LineItemsController中的NoMethodError #create 用于9的未定义方法`line_items':Fixnum Rails.root:/ home / tmiskiew / depot *

* app / controllers / line_items_controller.rb:53:在'create'中 请求 参数: { “PRODUCT_ID”=&gt; “中4”,  “authenticity_token”=&gt; “中dR4nL5zI + R7qIIPwNkl3EoaI1KyFWRokvh92m3PwD8o =”} *

任何人都知道@ cart.line_items.build有什么问题吗? 我正在使用rails 3.0.9和ruby 1.8.7

由于 托马斯

4 个答案:

答案 0 :(得分:2)

看看你的错误
undefined method line_items' for 9:Fixnum

这表示@cart是一个数字,而不是Cart对象(来自create action的@cart = current_cart返回一个数字),
current_cart函数返回一个数字,因为 Cart.find(session [:cart_id])返回recordNotFound,并且将执行rescue函数中的current_cart块。

请记住,Ruby中的每个函数都会返回上一个执行行的结果,因此您将返回cart.id

编辑:首先评论,尝试重写方法

    def current_cart
      Cart.find(session[:cart_id])
      rescue ActiveRecord::RecordNotFound
        cart = Cart.create
        session[:cart_id] = cart.id
        cart # this will get returned
      end
    end

答案 1 :(得分:2)

以下是我修复它的方法......希望它也适合你。

<强> /app/models/cart.rb:

def add_product(product_id)
    current_item = line_items.find_by_product_id(product_id)
    if current_item
      current_item.quantity += 1
    else
      current_item = line_items.build(:product_id => product_id)
    end
    return current_item
end

添加返回。我不是100%确定为什么会失败,但我认为函数只返回数量,而不是订单项,除非if语句的计算结果为真。

答案 2 :(得分:0)

我有类似的错误,但事实证明我在Cart.rb中有一个拼写错误:

class Cart < ActiveRecord::Base
    has_many :line_items, :dependent => :destroy
end
输入错误信息......它会导致未定义的方法...希望这有帮助。

答案 3 :(得分:0)

我遇到了同样的问题,我感到非常困惑。 我通过回滚数据库并再次迁移它来修复它。

终端上的命令:

  • rake db:rollback
  • rake db:migrate