【问题标题】:undefined method `empty?' for nil:NilClass how to avoid it未定义的方法“空?”对于 nil:NilClass 如何避免它
【发布时间】:2015-08-04 09:30:05
【问题描述】:

大家好,我有这个代码:

 @coursesFound = @user.available_courses
@courses = []

for course in @coursesFound do
  @courseInGroups = course.user_groups
  for group in @courseInGroups do
    @group = UserGroup.find group.id
    if @group.users.map { |u| u.id }.include? @user.id
      @courses << course
      break
    end
  end
end

# Wenn ein Kurs keiner Gruppe hinzugefügt wurde
if @courseInGroups.empty?
  @courses << course
end

在我的 debian vm 上它工作正常,但在我的 live 系统上我收到了这个错误:

undefined method `empty?' for nil:NilClass

我怎样才能避免这种情况?

【问题讨论】:

  • 什么是@courseInGroups
  • 在上面添加了更多代码
  • 在 CoursesFound 中是一个包含很多课程的对象。
  • @Felix more = other,您的代码不再包含 empty? 调用。
  • 抱歉添加了错误的代码 :) 现在全部在

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

如果这个@coursesFound = @user.available_courses 返回一个空的activerecord 关系。

那么这将不会执行

for course in @coursesFound do
  @courseInGroups = course.user_groups
  for group in @courseInGroups do
    @group = UserGroup.find group.id
    if @group.users.map { |u| u.id }.include? @user.id
      @courses << course
      break
    end
  end
end

这意味着当你到达这里时@courseInGroups 为零

if @courseInGroups.empty?
  @courses << course
end

所以你的快速解决方法是

if @courseInGroups && @courseInGroups.empty?
  @courses << course
end

【讨论】:

  • 或者你可以用blank?替换empty?
  • 是的,那行得通。显然我今天早上有点慢:)
  • 问题解决了..我必须把if @courseInGroups.empty? @courses &lt;&lt; course end放在第一位
【解决方案2】:

并且在使用 rails 时不要忘记blank?Here 您可以很好地了解所有带或不带导轨的方法。

我没有分析你的代码,只是给你,我和其他不经常使用这种方法的人,把它们混合起来然后来这里——只是要记住:empty?不是blank?

【讨论】:

    【解决方案3】:

    您还需要正确初始化您的对象。

    @courseInGroups = course.user_groups || []
    

    如果您正确初始化,您将不会再收到nil:NilClass 错误。

    要摆脱nil:NilClass 错误,您可以使用其他答案。比如try等等。

    【讨论】:

    • 以防万一“course.user_groups”将返回一个 ActiveRecord 关系,这与“[]”是一个数组不同。使用 "Course.none" (Model.none) 会返回一个 empty ActiveRecord 关系,这会比“[]”更好.
    【解决方案4】:

    您可以使用try 方法来避免此错误:

    @courseInGroups.try(:empty?)
    

    如果 @courseInGroups 为 nil,则不会抛出错误。

    【讨论】:

    • 它有什么作用?掩盖它?
    【解决方案5】:

    您可以将? 放在empty 的点之前:

    if @courseInGroups?.empty
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多