测试失败:ActionView :: Template :: Error:nil的未定义方法`title':NilClass

时间:2012-07-20 20:12:14

标签: ruby-on-rails ruby-on-rails-3

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

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

orders.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

products.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

2 个答案:

答案 0 :(得分:2)

正是错误所说的,您试图在title类型的对象上调用未定义的方法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's try helper,并防止在product为零的情况下抛出零错误。

看起来你的灯具没有正确写好。 line_item#2是有问题的...你需要改变line_item#2来说产品:ruby而不是product_id:1。那应该修复它。如夹具文档中所述(见下文)。

看起来您还需要将灯具定义为可在测试中访问,如下所示:

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

有关详细信息,请参阅rails fixture docs。 (特别是标题为“使用夹具”的部分。)

答案 1 :(得分:0)

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

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

如果您不想清除数据库,也可以用另一种方法解决此问题。

添加if line_item.product

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