无法调用计算字段rails3

时间:2011-06-24 11:29:18

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

我有一个非常简单的成本模型属于订单。

每个成本都有一个值和数量,我正在计算总数:

def set_total
    @set_total = quantity * amount
end

这很有效,在我的费用视图中,我可以致电:

<td><%= number_to_currency(cost.set_total, :unit => "&pound;") %></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 => "&pound;") %>
    <%= 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 => "&pound;") %></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

3 个答案:

答案 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(....) 确保在那之后保存它们,这可能是问题所在。

尝试使用控制台创建和播放对象,查看是否验证失败,而不是保存等