Ruby on rails 检查rails中的字段是否为空

Ruby on rails 检查rails中的字段是否为空,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我看过关于堆栈溢出的以下帖子: 我尝试了一些不同的方法来检查记录的存在,但我的代码仍然抛出一个错误: undefined method `links' for nil:NilClass 我有一个应用程序控制器: def header_links_when_signedin if signed_in? @header = @current_group.navbars.where(:header => true, :signedin => true).first

我看过关于堆栈溢出的以下帖子:

我尝试了一些不同的方法来检查记录的存在,但我的代码仍然抛出一个错误:

undefined method `links' for nil:NilClass
我有一个应用程序控制器:

def header_links_when_signedin
  if signed_in? 
    @header = @current_group.navbars.where(:header => true, :signedin => true).first
    unless @header.links.first.blank?
      @header.links
    end
  end
end
我在这一行得到了错误:

unless @header.links.first.blank?
或者当我以前没有为正在调用的导航栏创建链接时,我包含
链接的任何地方


当我创建了字段后,一切都很好,我只是介绍了尚未为组创建导航栏链接的用例。

问题是
@header
为零(未找到任何标题)。要避免此错误,请尝试:

if @header && @header.links
  @header.links
end

在此验证
@header
@header.links
是否存在。顺便问一下,您想对实例变量
@header
执行什么操作?因为
@header.links
没有任何作用。

问题是
@header
为零(未找到任何头)。要避免此错误,请尝试:

if @header && @header.links
  @header.links
end
在此验证
@header
@header.links
是否存在。顺便问一下,您想对实例变量
@header
执行什么操作?因为
@header.links
没有任何作用。

更好的是:

@header.try(:links)
这将在调用@header上的“links”之前自动检查@header是否为nil

如果你真的在乎,你可以:

@header.try(:links) unless @header.try(:links).try(:empty?)
但是你应该弄清楚为什么@header是零。

更好的是:

@header.try(:links)
这将在调用@header上的“links”之前自动检查@header是否为nil

如果你真的在乎,你可以:

@header.try(:links) unless @header.try(:links).try(:empty?)

但是你应该弄清楚为什么@header是nil。

虽然我同意我不会像那样链接尝试,但我认为使用try比显式检查nil要干净得多,而且无论哪种方式,最终都会得到相同的结果。还要注意的是,链接文章处理的是散列,这比使用try有更好的方法,第二篇文章更多的是关于Demeter的问题。虽然我同意我不会像那样连锁尝试,但我认为使用try比显式检查nil要干净得多,而且无论哪种方法,最终都会得到相同的结果。还要注意的是,链接的文章是处理哈希的,这比使用try有更好的方法,第二篇文章更多的是关于Demeter的问题。