这是在我的_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
答案 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) %>