nil的未定义方法`[]':尝试从哈希中提取值时为NilClass

时间:2013-01-27 07:22:05

标签: ruby ruby-on-rails-3

我是Ruby的新手,并且在大多数情况下它开始有意义,但后来我遇到了这个问题。

我使用以下搜索用户:

user = User.find_by_id(user_id)

我可以user.inspect,它显示为:

#<User id: 1, username: "test_user", first_name: "test", last_name: "user">

然而,当我尝试做的时候:

user[:id] 

我明白了:

undefined method `[]' for nil:NilClass

我在俯瞰什么?

这是user.rb:

class User < ActiveRecord::Base

  # Validations
  validates :first_name, :last_name, :presence => true
  validates :username, :uniqueness => {:allow_blank => true}

  # Setup accessible (or protected) attributes for your model
  default_fields = [:username, :first_name, :last_name]
  attr_accessible *default_fields

  # Instance Methods
  def full_name
    "#{first_name} #{last_name}"
  end
end

此外,如果我这样做:

user.to_s

导致:

#<User:0x007fdad09717f8>

这进一步让我相信它不是零,但我不能引用哈希值。

2 个答案:

答案 0 :(得分:0)

你的第一句话

user = User.find_by_id(user_id)

返回了一个null对象,因此您需要对此进行测试以避免异常:

if( ! user.nil? )
# code with user[:id]    
end

答案 1 :(得分:0)

所以问题不是与代码有关,而是与我用来获取'user_id'值的Database表中的数据有关。多数民众赞成我相信其他人会在项目中的所有模型上都有适当的验证。

如果我不需要创建一个可以重现问题的最小例子,那么每个人都可以帮我解决这个问题。我从来没有偶然发现数据库中的错误条目。

所以要使用Miguel Prz's想法我最终这样做了:

user.nil? ? '' : user[:id] 

这进一步证明了为什么我永远不要相信任何其他人的工作:)