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

プログラミングに慣れていないので、重要なことの1つは、エラーメッセージをよく見ることです。

残念ながら、エラーメッセージが少しわかりにくい場合があります。個人的には、特にそれが学習しようとしている新しいプログラミング言語の場合は、エラーメッセージを2回読まなければならないことがよくあります。

次に、エラーのシーケンスを分解します。

この場合、エラーは、メッセージのように、レコードがないことを示しています。

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

IDが1のユーザーを検索しようとしたため、エラーが発生しました。元の操作は次のとおりです。

User.find(1)

あなたのコメントによると、これは「破棄」操作によって進められたため、データが削除されます。もちろん、これは、レコードが1つあるか、この1つのレコードを破棄するように要求したことを前提としています。もちろん、他の人が述べているように、find操作は例外をスローします

APIはRailsAPIで文書化されており、必要なのは次のことを説明するfindメソッドの詳細です。

リストされたすべてのIDのレコードが見つからない場合、RecordNotFoundが発生します。

もう1つの良いリファレンスはAPIDockです

于 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

また、例外をキャッチし、レコードが見つからない場合に他のアクションを実行することもできます。このようなもの:

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 に答える
0

find失敗するとエラーが発生しますが、find_by_<attribute here>メソッドは単に を返しnilます。したがって、この場合find_by_id、スタック トレースの代わりに、nil を返す which を使用できます。

于 2011-08-29T07:14:27.983 に答える