rails ams,嵌套模型undefined方法`'for nil:NilClass

时间:2016-08-25 16:48:25

标签: ruby-on-rails ruby-on-rails-4 serialization nested-attributes active-model-serializers

我有以下型号:

class Appeal < ActiveRecord::Base
  belongs_to :applicant, :autosave => true
  belongs_to :appealer, :autosave => true
end

class Appealer < ActiveRecord::Base
  has_many :appeals, :autosave => true
end

class Applicant < ActiveRecord::Base
  has_many :appeals
end

我想要的是每位申诉人都可以提及他最后申诉的申请人

所以我将Appealer模型修改为:

class Appealer < ActiveRecord::Base
  has_many :appeals, :autosave => true

  def last_applicant
    return self.appeals.last.applicant
  end
end

但是我收到了错误:

undefined method `applicant' for nil:NilClass

奇怪的是,如果我调试它(​​通过RubyMine - Evaluate Expression)我可以得到申请人。

如果我试图获得最后一次上诉:

class Appealer < ActiveRecord::Base
  has_many :appeals, :autosave => true

  def last_appeal
    return self.appeals.last
  end
end
一切正常。

我正在使用active-model-serializer,尝试在序列化程序中也这样做(我实际上在特定的调用中需要这个值 - 而不是整个模型)但它也没有使用相同的错误。

AMS代码:

class AppealerTableSerializer < ActiveModel::Serializer
  attributes :id, :appealer_id, :first_name, :last_name, :city
  has_many :appeals, serializer: AppealMiniSerializer

  def city
    object.appeals.last.appealer.city
  end

end

我的问题: 如何在JSON中获取嵌套对象属性? 我做错了什么?

修改 我的控制器电话:

class AppealersController < ApplicationController
  def index
    appealers = Appealer.all
    render json: appealers, each_serializer: AppealerTableSerializer, include: 'appeal,applicant'
  end
end

我尝试过使用和不使用包含,仍然无效

1 个答案:

答案 0 :(得分:1)

也许我错过了一些东西,因为这看起来你的Appealer记录还没有任何上诉。

在这种情况下,此代码

def last_appeal
  return self.appeals.last
end

将返回nil,它不会引发任何错误。但如果你打电话给这个

def last_applicant
  return self.appeals.last.applicant
end

return self.appeals.last为nil,您尝试在nil对象上调用applicant方法而不是Appeal对象。

要修复它,只需添加检查nil

class Appealer < ActiveRecord::Base
  has_many :appeals, :autosave => true

  def last_applicant
    last = self.appeals.last

    if last.nil?
      return nil
    else
      return last.applicant
    end
  end
end