2

我正在阅读 Michael Hartl 的 Rails 教程,特别是第 6 章:

http://ruby.railstutorial.org/chapters/modeling-and-viewing-users-one#sec:finding_user_objects

在 user.destroy 命令之后执行 User.find(1) 后,我收到以下错误消息:

ruby-1.9.2-p290 :006 > User.find(1)
ActiveRecord::RecordNotFound: Couldn't find User with ID=1
    from /Users/me/.rvm/gems/ruby-1.9.2-p290@rails3/gems/activerecord-3.0.9/lib/active_record/relation/finder_methods.rb:304:in `find_one'
    from /Users/me/.rvm/gems/ruby-1.9.2-p290@rails3/gems/activerecord-3.0.9/lib/active_record/relation/finder_methods.rb:289:in `find_with_ids'
    from /Users/me/.rvm/gems/ruby-1.9.2-p290@rails3/gems/activerecord-3.0.9/lib/active_record/relation/finder_methods.rb:107:in `find'
    from /Users/me/.rvm/gems/ruby-1.9.2-p290@rails3/gems/activerecord-3.0.9/lib/active_record/base.rb:444:in `find'
    from (irb):6
    from /Users/me/.rvm/gems/ruby-1.9.2-p290@rails3/gems/railties-3.0.9/lib/rails/commands/console.rb:44:in `start'
    from /Users/me/.rvm/gems/ruby-1.9.2-p290@rails3/gems/railties-3.0.9/lib/rails/commands/console.rb:8:in `start'
    from /Users/me/.rvm/gems/ruby-1.9.2-p290@rails3/gems/railties-3.0.9/lib/rails/commands.rb:23:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

我一般是编程新手,我不知道从哪里开始。谷歌搜索错误消息并没有发现任何有用的信息。一切看起来都很好,我只是不知道为什么我除了异常之外还收到错误消息。

4

4 回答 4

2

由于您是编程新手,因此关键的一件事是仔细查看错误消息。

不幸的是,有时错误消息有点神秘,我个人发现我经常需要阅读它们两次,特别是如果它是你正在尝试学习的一种新的编程语言。

现在解构错误的顺序。

在这种情况下,错误表明您没有记录,根据消息:

ActiveRecord::RecordNotFound: Couldn't find User with ID=1

错误是因为您试图查找 ID 为 1 的用户。原始操作是:

User.find(1)

其中,根据您的评论,是通过“销毁”操作进行的,从而删除了数据。当然,这假设您有一个记录,或者要求销毁该记录。当然,正如其他人所说,查找操作会引发异常

该 API 记录在Rails API中,您想要的是有关 find 方法的详细信息,其中描述:

如果无法找到所有列出的 id 的记录,则会引发 RecordNotFound。

另一个很好的参考是API Dock

于 2011-08-29T07:32:35.810 回答
1

如果你这样做,你不会得到例外

 User.first(:conditions => { :id => 1 })

你得到异常的原因是 Rails 假设如果你使用 find(id) 方法,你期望这样的对象存在。如果没有给定 id 的对象,则将其视为错误并引发异常。另一方面,如果您使用 .first 方法并编写条件,则不会告诉 rails 您希望该对象存在-它可能存在但可能不存在,这就是为什么在这种情况下不会引发异常的原因。这有点棘手:) 希望有点清楚,为什么你的情况会出现异常,而不是我写的那个。这是解释您的期望的简单问题。

于 2011-08-28T23:45:52.803 回答
0

find导致失败时引发错误,而find_by_<attribute here>方法只是 return nil。因此,在这种情况下,您可以使用find_by_idwhich 将返回 nil 而不是堆栈跟踪。

于 2011-08-29T07:14:27.983 回答
0

您还可以捕获异常,并在未找到记录时执行其他操作。像这样的东西:

begin
  @user = User.find(id)
  respond_with @user
rescue ActiveRecord::RecordNotFound
  flash[:alert] = "User with id = #{id} not found"
  redirect_to users_path
end
于 2011-08-29T07:26:35.317 回答