1

这是在我的 _line_items.text.erb 文件中:

<%= sprintf("%2d x %s", line_item.quantity,
              truncate(line_item.product.title, length: 50)) %>

订单.yml

one:
  name: Dave Thomas
  address: MyText
  email: dave@example.org 
  pay_type: Check

line_items.yml

one:
  product: ruby
  cart_id: 1
  order: one

two:
  product_id: 1
  cart_id: 1
  order: one

产品.yml

ruby:
  title: Programming Ruby 1.9 
  description: 
    Ruby is the fastest growing and most exciting dynamic language out there. 
    If you need to get working programsdelivered fast, you should add Ruby to your toolbox.
  price: 49.50 
  image_url: ruby.png

这一切似乎都是正确的。

下面是实际测试:

class OrderNotifierTest < ActionMailer::TestCase
  test "received" do
    mail = OrderNotifier.received(orders(:one))
    assert_equal "Pragmatic Store Order Confirmation", mail.subject
    assert_equal ["dave@example.org"], mail.to
    assert_equal ["depot@example.com"], mail.from
    assert_match  /1 x Programming Ruby 1.9/, mail.body.encoded
  end

关于在哪里寻找ActionView::Template::Error: undefined method 'title' for nil:NilClass错误的任何想法?

更新:

class LineItem < ActiveRecord::Base
  attr_accessible :cart_id, :product_id, :quantity, :order_id, :product, :cart, :price
  belongs_to :order
  belongs_to :cart
  belongs_to :product

  def total_price 
    self.price * self.quantity
  end
end
4

2 回答 2

2

这正是错误所说的,您试图title在 type 的对象上调用未定义的方法NilClass。如果您查看您提供的代码行,您应该能够看到错误所在:

<%= sprintf("%2d x %s", line_item.quantity,
          truncate(line_item.product.title, length: 50)) %>

读取的部分line_item.product.title是问题所在。该product项目必须为零。我建议将其更改为line_item.product.try(:title),这将利用Rails 的 try 助手,并防止在事件product为 nil 时抛出 nil 错误。

看起来您的固定装置没有正确编写。 line_item# 2 是有问题的...你需要将 line_item #2 更改为 product: ruby​​ 而不是 product_id: 1。这应该可以解决它。如夹具文档中所述(见下文)。

看起来您还需要将固定装置定义为在您的测试中可以访问,如下所示:

class OrderNotifierTest < ActionMailer::TestCase
  fixtures :orders, :line_items, :products
  ...

有关更多信息,请参阅rails 夹具文档。(特别是标题为“使用夹具”的部分。)

于 2012-07-20T20:41:17.850 回答
0

我有同样的错误,我通过清除数据库解决了它。

在添加“Order”表(或单独的“PayType”表而不是“Order”表中的“pay_type”字段)后,您可能已经在数据库中拥有不再相关的数据。您需要清空购物车或清除数据库。

You can also solve this problem in another way, if you don't want to clear the database.

Add if line_item.product

<%= sprintf("%2d x %s", line_item.quantity,
      truncate(line_item.product.title, length: 50) if line_item.product) %> 
于 2018-07-14T21:29:35.560 回答