我正在使用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
我的关系是否正确?在创建订单和所有内容时,外键在其他地方工作。就在这个观点中。非常感谢您的帮助。
答案 0 :(得分:3)
旁注:您的belongs_to :payment_types
应为belongs_to :payment_type
。对于任何给定的订单,您只有一种付款方式。
这是因为此特定订单没有付款类型(order.payment_types
为nil
)。
要解决此问题,您可以执行以下操作:
<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
。