
[英]undefined method `id' for nil:NilClass (Devise - Rails 5)
[英]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.first
, file
局部变量将被指定为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.