NoMethodError:未定义的方法

时间:2016-05-24 09:43:43

标签: ruby-on-rails ruby

我正在使用ruby on rails进行敏捷Web开发。在运行测试时,我得到以下结果:

Error: LineItemsControllerTest#test_should_update_line_item:
NoMethodError: undefined method 'product_id' for nil:NilClass
        test/controllers/line_items_controller_test.rb:13:in `block in <class:LineItemsControllerTest>

这是我的测试文件

require 'test_helper'

class LineItemsControllerTest < ActionController::TestCase
  test "should create line_item" do 
    assert_difference('LineItem.count') do 
        post :create, product_id: products(:ruby).id 
    end

    assert_redirected_to cart_path(assigns(:line_item).cart)
  end

test "should update line_item" do
  patch :update, id: @line_item, line_item: { product_id: @line_item.product_id }
  assert_redirected_to line_item_path(assigns(:line_item))
end

end

有人可以解释为什么我会得到NoM​​ethodError:未定义的方法,而书中说它应该没问题?

谢谢!

更新1

根据下面Boltz0r的评论,这是我的创建和更新方法。我尝试比较我所拥有的内容与书中的内容,但似乎无法找到问题所在。

def create
    product = Product.find(params[:product_id])
    @line_item = @cart.add_product(product.id)


    respond_to do |format|
      if @line_item.save
        format.html { redirect_to @line_item.cart, notice: 'Line item was successfully created.' }
        format.json { render :show, status: :created, location: @line_item }
      else
        format.html { render :new }
        format.json { render json: @line_item.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @line_item.update(line_item_params)
        format.html { redirect_to @line_item, notice: 'Line item was successfully updated.' }
        format.json { render :show, status: :ok, location: @line_item }
      else
        format.html { render :edit }
        format.json { render json: @line_item.errors, status: :unprocessable_entity }
      end
    end
  end

2 个答案:

答案 0 :(得分:1)

该错误意味着在这里:

patch :update, id: (at)line_item, line_item: { product_id: (at)line_item.product_id }

(at)line_item为零。所以这意味着您可能在创建方法或更新方法中有错误(您没有获得正确的line_item)

答案 1 :(得分:1)

我已经检查了书中的实际示例,现在将发布答案,以便其他人可以看到它。如果您要进行测试是update操作,您应该首先进行更新。这就是为什么书中的测试和任何其他现实测试都有setup方法来预先创建测试项目的原因:

setup do
  @line_item = line_items(:one)
end