我有一个非常简单的成本模型属于订单。
每个成本都有一个值和数量,我正在计算总数:
def set_total
@set_total = quantity * amount
end
这很有效,在我的费用视图中,我可以致电:
<td><%= number_to_currency(cost.set_total, :unit => "£") %></td>
但是,我似乎无法在我的订单显示视图中显示此内容 - 获取NoMethodError:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.*
在订单中,显示,我有这个:
<% unless @order.costs.empty? %>
<% @order.costs.each do |cost| %>
<%= cost.description %>
<%= cost.cost_type %>
<%= number_to_currency(cost.amount, :unit => "£") %>
<%= cost.quantity %>
<%= cost.set_total %>
<% end %>
<% end %>
我的路线设置正常:
resources :orders do
:costs
end
如果我使用表格来显示信息,我会在最后得到一个空白行。费用偏:
<% unless @order.costs.empty? %>
<table border='1' cellpadding="5">
<tr>
<th>Description</th>
<th>Type</th>
<th>Amount</th>
<th>Quantity</th>
<th>Total</th>
</tr>
<% @order.costs.each do |cost| %>
<tr>
<td><%= cost.description %></td>
<td><%= cost.cost_type %></td>
<td><%= number_to_currency(cost.amount, :unit => "£") %></td>
<td><%= cost.quantity %></td>
<td><%= cost.set_total %></td>
</tr>
<% end %>
</table>
<% end %>
可以看到底部有一个额外的表格行,看不清楚原因。认为这导致了零价值。
- 编辑 -
启用调试后,我仍然可以看到额外的行:
!ruby/ActiveRecord:Cost
attributes:
description:
cost_type:
amount:
order_id: 14
code:
created_at:
updated_at:
quantity:
这没有意义,因为我刚刚重置数据库...为什么创建空白成本,甚至没有ID。
更新
class CostsController < ApplicationController
before_filter :authenticate_user!
load_and_authorize_resource
def index
@costs = Cost.paginate(:per_page => 3, :page => params[:page])
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @costs }
end
end
def show
@costs = Cost.find(params[:id])
end
def new
end
def edit
end
def create
@order = Order.find(params[:order_id])
@cost = @order.costs.create(params[:cost])
redirect_to order_path(@order)
end
end
答案 0 :(得分:1)
The error occurred while evaluating nil.*
该错误意味着您尝试在*
对象上调用nil
方法。
def set_total
@set_total = quantity * amount
end
确保每个quantity
记录的Cost
属性设置为非零值。
或将您的方法更改为:
def set_total
@set_total = (quantity || 0) * amount
end
答案 1 :(得分:1)
您能否发布您的控制器代码?
我认为您使用@orders.costs.new
或@orders.costs.build
之类的东西在控制器中构建新的费用?
您对该表的最后评论即使此订单没有成本,也会验证此假设
更新:
同样对于方法set_total,您应该考虑将其重构为:
def total
@total ||= quantity.to_i * amount
end
使用此代码,将为此对象上的其他调用total
缓存总值
使用total而不是set_total作为方法的名称更接近ruby / rails惯例。
答案 2 :(得分:0)
您的费用有所增加。
当你创建时,你使用@order.costs.new(....)
确保在那之后保存它们,这可能是问题所在。
尝试使用控制台创建和播放对象,查看是否验证失败,而不是保存等