繁体   English   中英

Rails:nil的未定义方法`id':NilClass

[英]Rails: undefined method `id' for nil:NilClass

我正在渲染这样的形式:

= f.fields_for :files do |files_form|
  = render('file_form', f: files_form)

在_file_form.html.slim我有这样的代码:

- id = f.object.id
- file= f.object.files.first

li.panel.panel-default
  .panel-heading role="tab" id="heading"
    a.file-heading data-toggle="collapse" data-parent="#files" href="#collapse#{id}"
      div.clearfix role="button"
        span = f.object.name
  .panel-collapse.collapse-in id="collapse#{id}" role="tabpanel"
    .panel-body
      .clearfix = link_to(t('shared.destroy'), '#', class:'btn btn-warning btn-sm discard-file pull-right')
      .form-group
        = f.label(:name, t('activerecord.attributes.file.name'))
        = f.text_field(:name, class: 'form-control')
        = f.label(file.id) //my problem

一切正常,直到我尝试使用文件ID获取标签。

错误消息:nil的未定义方法`id':NilClass

它看起来像是没有初始化但实际上,当我在调试器中检查它之前与file.id行,它被初始化,我可以很容易地检查它的值。

当我使用:id而不是file.id时 ,一切正常。 为什么?

当我试图从中检索id(或任何其他数据)时,为什么文件是nil类?

您的files集合为空。 因此,当您执行file = f.object.files.firstfile局部变量将被指定为nil

当您尝试将其作为具有名称为id的属性的对象进行访问时,它会被抛出。

根据您的使用情况,如果集合中没有元素或使用技术处理nil值,您可以保释:

f.label(file.try(:id))

要么

f.label(file&.id) # Ruby 2.3.0 and up

要么

f.label(file.id rescue 'placeholder label')

UPDATE

要使fields_for起作用,父模型需要接受您使用的关联对象的属性。 确保在父模型中具有此功能:

has_many :files
accepts_nested_attributes_for :files

除非后面的行存在,否则表单对象将为nil,这可能是您正在观察的行为的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM