修复nil的未定义方法:NilClass

时间:2015-07-29 02:23:37

标签: ruby-on-rails

我正在使用照片控制器,现在突然某些用户无法查看他们的个人资料,并显示We're sorry, but something went wrong.错误。

我一直在四处寻找,我不知道我做了什么导致这一点。我知道它读取undefined method state,但用户都有一个属于州的邮政编码。所有的配置文件都在运行。我首先注意到这一点,因为我的个人资料显示错误。

用户模型:

  belongs_to :location, :foreign_key => :zip_code, :primary_key => :zip_code

  def similar
    arr = User.where(:gender => self.gender).where.not(:id => self.id)
    arr.select{|c| c.location.state == self.location.state }
  end

  def location

      if Location.by_zip_code(self.zip_code.to_s).any?
          return Location.by_zip_code(self.zip_code.to_s).first
      else
          return nil
      end
  end

用户控制器:

  def show
    @user = User.find_by(username: params[:id])
    @similar_users = @user.similar.shuffle.first(8)
      end

1 个答案:

答案 0 :(得分:0)

从您的日志中,您可以看到您在某些内容上调用方法状态。

Jul 28 19:14:21 domain app / web.1:NoMethodError(未定义的方法state' for nil:NilClass): Jul 28 19:14:21 domain app/web.1: app/models/user.rb:75:in阻止类似' 7月28日19:14:21域名app / web.1:app / models / user.rb:75:在'相似'中

在您编辑的答案中,您可以看到罪魁祸首。你在其他陈述中返回nil。

  def location
      if Location.by_zip_code(self.zip_code.to_s).any?
          # you can return all here if you want more than one
          # for testing just returning the first one
          return Location.by_zip_code(self.zip_code.to_s).first
      else
          return nil
      end
  end

但你不在这里检查nil(c.location.state)

def similar
    arr = User.where(:gender => self.gender).where.not(:id => self.id)
    arr.select{|c| c.location.state == self.location.state }
end

像我下面的东西可能会做到这一点

def similar
    arr = User.where(:gender => self.gender).where.not(:id => self.id)
    arr.select{ |c|
        if !c.location.nil? 
            return c.location.state == self.location.state
        else
            return false
        end
    }
end

对于问题的其他部分,您可能在Location模型中出错。没有看到代码,我无法帮助你,但上述内容将帮助你的代码优雅地失败。