0

我是 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>

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

4

2 回答 2

0

你的第一句话

user = User.find_by_id(user_id)

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

if( ! user.nil? )
# code with user[:id]    
end
于 2013-01-27T07:37:52.857 回答
0

所以问题结果与代码无关,而是与我用来获取“user_id”值的数据库表中的数据有关。这就是我相信其他人会在项目中的所有模型上编写适当的验证所得到的。

这就是帮助我解决这个问题的每个人,如果我不需要创建一个重现该问题的最小示例,我永远不会偶然发现数据库中的错误条目。

所以为了使用Miguel Prz 的想法,我最终这样做了:

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

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

于 2013-01-27T17:24:05.923 回答