Ruby on rails 未定义的方法'number';零级:零级

Ruby on rails 未定义的方法'number';零级:零级,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在“属于”关系中显示属性时遇到问题。租约属于单位所有。装置在数据库中有一列“编号”。当我试图在lease show页面上显示此属性时,它给了我一个错误,即nil:NilClass的未定义方法'number'。我觉得我在做一些愚蠢的事情,并且过度关注它 lease.rb belongs_to :unit unit.rb has_many :leases 租赁控制器.rb def show @lease = Lease.find(params[:id]) end 视图/租约/

我在“属于”关系中显示属性时遇到问题。租约属于单位所有。装置在数据库中有一列“编号”。当我试图在lease show页面上显示此属性时,它给了我一个错误,即nil:NilClass的未定义方法'number'。我觉得我在做一些愚蠢的事情,并且过度关注它

lease.rb

belongs_to :unit
unit.rb

has_many :leases
租赁控制器.rb

  def show
    @lease = Lease.find(params[:id])
  end
视图/租约/show.html.erb

<%= @lease.unit.number %>

如果我将显示页面代码更改为@lease.unit\u id,它将显示该单元的id。这是我的数据库的图片,显示了单位id。

您的模型可能具有unit_id属性,但是如果
units
没有
id=1的记录,您检查了吗

快速(脏)修复:


您必须在租赁模型上验证单元ID的存在

validates :unit, presence: true
所以,除非您将unit_id设置为Lease instance,否则您的租赁模型不会保存到数据库中

delegate :number, to: :unit, prefix: true
现在,您可以从数据库中删除现有的机组记录,然后重新开始

您可能需要增加每个数据的完整性,请阅读


更新 好的,如果“DBA在某些情况下删除记录”呢

您可以委托给单元号来租赁实例

delegate :number, to: :unit, prefix: true

现在你可以访问lease.unit.number,即使单位id为零,你也可以使用
lease.unit.number

来访问它。这会清除错误,但不会显示任何内容。@DhatchXIX因为我说,检查单位表是否有idI单位忘记了我在db测试其他东西时弄错了,忘了重新更改它。我很感激你告诉我,我知道这是件愚蠢的事情。没错,但DBA在某些情况下删除记录的情况又如何呢?任何应用程序必须对任何类型的故障保持稳定,即使某些记录不存在。(;关于删除数据:最好不要删除数据,而是在表中设置
deleted
标志,这是一种软删除功能。人类行为是不可预测的,因此我总是使用
softDelete
技术,让垃圾收集器每天运行一次,并每月清除
deleted=1
已删除的记录继续。请检查我上面更新的答案,我告诉他删除数据,因为我假设他在开发环境中。我知道你想说什么,但这不是问题的答案,这是防止失败情况的解决方案。但这是一个很好的解决方案,upvote是我做的(;好的,谢谢,但是关于“删除”标志,这也超出了这个问题的范围,并且不是每个应用程序都需要的,因此它取决于应用程序的要求,在需要之前不要添加任何复杂的东西->