预期的响应是,但是

我正在关注“使用rails进行敏捷Web开发”一书。 我有个问题。 这是我在order控制器中的new方法:

 def new @cart = current_cart if @cart.line_items.empty? redirect_to store_url, notice: "Your cart is empty" return end @order = Order.new respond_to do |format| format.html # new.html.erb format.json { render json: @order } end end 

这是测试:

 test "should get new" do cart = Cart.create session[:cart_id] = cart.id li = LineItem.create(product: products(:ruby)) li.cart = cart get :new assert_response :success end 

rake test显示失败:

 Expected response to be a , but was  

我用rails命令行检查了它,如下所示:

 cart = Cart.create => # products = Product.create(:title => "Lorem Ipsum", :description => "Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem", :price => 49.50, :image_url => "ruby.png") => #<Product id: nil, title: "Lorem Ipsum", description: "Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem", image_url: "ruby.png", price: #, created_at: nil, updated_at: nil> li = LineItem.create(product: products) => # li.cart = cart => # 

li.cart显示相应的cart ,但cart.line_items为空。 两个模型(carts和line_items)并且彼此相关。 为什么cart.line_items空?

save购物车分配后, save您的列表项。

 test "should get new" do cart = Cart.create session[:cart_id] = cart.id li = LineItem.create(product: products(:ruby)) li.cart = cart li.save! // Do this and make sure it doesn't raise an exception. get :new assert_response :success end 

只是分配不会在数据库中注册更改,因此@cart.line_items将保持为空。 因此,在您的控制器中,if检查将重定向。 302代码用于重定向。

或者只使用write_attribute或update_attribute

 li.write_attribute :cart, cart