RoR外键内部视图和nil对象

时间:2009-09-08 01:01:06

标签: ruby-on-rails

我正在使用Rails进行Agile Web开发,并遇到任务E问题并将支付类型添加到数据库中。在订单表中,有一个外键将列payment_type_id与payment_types数据库(包含列id,标签和值)相关联。

因此,订单的payment_type_id为1,对应于“信用卡”,“cc”的payment_types条目

class Order < ActiveRecord::Base
has_many :line_items
belongs_to :payment_types


class PaymentType < ActiveRecord::Base
has_one :order

然后在Order控制器

class OrdersController < ApplicationController
  # GET /orders
  # GET /orders.xml
  def index
    @orders = Order.all

然后在index.html.erb视图中:

<% @orders.each do |order| %>
  <tr>
    <td><%=h order.name %></td>
    <td><%=h order.payment_types.label %></td>

这会出现以下错误:

“当你没想到它时,你有一个零对象! 在评估nil.label“

时发生错误

代码行order.payment_types.label

我的关系是否正确?在创建订单和所有内容时,外键在其他地方工作。就在这个观点中。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

旁注:您的belongs_to :payment_types应为belongs_to :payment_type。对于任何给定的订单,您只有一种付款方式。

这是因为此特定订单没有付款类型(order.payment_typesnil)。

要解决此问题,您可以执行以下操作:

<td><%=h order.payment_type.label if order.payment_type %></td>

甚至

<td><%=h order.payment_type.try(:label) %></td>

它做了很多相同的事情,但是使用了一些铁杆功夫(一些纯粹主义者会抱怨这个作为代码气味,但他们都可以停止抱怨并做一些有用的事情,比如建立一个棚)。

或者您可以设置支付类型一些(可能涉及更复杂的控制器,可能还有validates_presence_of :payment_type模型中的Order