2

我经历迈克尔·哈特尔的Rails的教程,特别是第6章:迈克尔·哈特尔的Rails的教程:User.find(1)销毁方法之后显示堆栈跟踪

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

后,我做了User.find (1)user.destroy命令后,我得到了以下错误消息:

ruby-1.9.2-p290 :006 > User.find(1) 
ActiveRecord::RecordNotFound: Couldn't find User with ID=1 
    from /Users/me/.rvm/gems/[email protected]/gems/activerecord-3.0.9/lib/active_record/relation/finder_methods.rb:304:in `find_one' 
    from /Users/me/.rvm/gems/[email protected]/gems/activerecord-3.0.9/lib/active_record/relation/finder_methods.rb:289:in `find_with_ids' 
    from /Users/me/.rvm/gems/[email protected]/gems/activerecord-3.0.9/lib/active_record/relation/finder_methods.rb:107:in `find' 
    from /Users/me/.rvm/gems/[email protected]/gems/activerecord-3.0.9/lib/active_record/base.rb:444:in `find' 
    from (irb):6 
    from /Users/me/.rvm/gems/[email protected]/gems/railties-3.0.9/lib/rails/commands/console.rb:44:in `start' 
    from /Users/me/.rvm/gems/[email protected]/gems/railties-3.0.9/lib/rails/commands/console.rb:8:in `start' 
    from /Users/me/.rvm/gems/[email protected]/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>' 

我一般是新的节目,我不知道从哪里着手。用谷歌搜索错误信息没有任何用处。一切看起来都很好,我只是不知道为什么我会在例外情况下得到错误信息。

回答

1

如果你

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

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

+0

啊好吧,我假设堆栈跟踪的是“预期的行为?” – dartfrog

+0

是,正好:) – mkk

+3

或'find_by_id',它是上面的一个较短版本。 –

0

find导致失败时出现错误,而find_by_<attribute here>方法仅返回nil。所以在这种情况下,您可以使用find_by_id,它将返回nil而不是堆栈跟踪。

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 
2

由于您是编程新手,所以关键的一点是仔细查看错误消息。

不幸的是,有时候这些错误信息有点含糊不清,而且我个人发现我经常需要读两遍,特别是如果它是一种您正在尝试学习的新编程语言。

现在解构错误的序列。

在这种情况下,错误表明你没有记录,因为每个消息:

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

的错误导致,因为你想找到的1.原有的操作ID的用户是:

User.find(1) 

其中,根据您的评论进行了'Destroy'操作,从而删除数据。那当然假设你有一条记录,或者要求销毁这条记录。当然,正如其他人所说,找到操作抛出

的API在Rails API记录和你想要的是找到方法的细节描述的异常:

如果可以为所有没有找到记录列出的ID,然后RecordNotFound将被提出。

另一个很好的参考是API Dock

相关问题