2009-09-08 27 views
0

我正在通过Rails进行敏捷Web开发,并遇到任务E问题并将支付类型添加到数据库。在订单表中,存在将列payment_type_id与payment_types数据库(其保存列标识,标签和值)相关的外键RoR外键视图和零对象

因此,订单具有的payment_type_id为1,其对应于payment_types中的条目“信用卡”, “CC”

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


class PaymentType < ActiveRecord::Base 
has_one :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

我是否有关系正确行创建订单,一切发生时的 错误?外键的作品在其他地方,它只是在该视图。感谢这么多的帮助

回答

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> 

这不同样的事情,但使用一些轨道功夫(有些纯粹主义者会抱怨关于这个问题,一个代码气味,但他们都可以停止抱怨,并做一些有用的事情,如建立棚屋)。

,或者您可以设置付款方式的如何(可能涉及更复杂的控制器,也许在你的Order模型。

+0

谢谢你。这是从payment_types到payment_type是固定它改变它。它使validates_presence_of :payment_type感觉虽然 每个订单都有一个payment_type,并且数据库中没有一个为null或者有一个无效的对应payment_type,所以我认为添加一个零检查只会掩盖真正的问题。 – mfanto 2009-09-08 01:28:56