我是 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>
这进一步使我相信它不是 nil,但我无法引用哈希值。
你的第一句话
user = User.find_by_id(user_id)
返回了一个 null 对象,因此您需要对此进行测试以避免异常:
if( ! user.nil? )
# code with user[:id]
end
因此,问题与代码无关,而是与我用来获取"user_id"值的数据库表中的数据有关。 这就是我信任其他人会对项目中的所有模型编写正确验证所得到的。
感谢大家帮助我解决这个问题,如果我不需要创建一个重现该问题的最小示例,我永远不会偶然发现数据库中的错误条目。
因此,为了使用Miguel Prz的想法,我最终做到了:
user.nil? ? '' : user[:id]
这进一步证明了为什么我永远不应该相信别人的工作:)