2016-03-28 3 views
0
私はマイケル・ハートルによってRailsのチュートリアル(第3版)の練習2

Railsチュートリアルch.10例2 - 未定義メソッド `activated? '

に取り組んでいます

それは2つの部分から構成され、第二の部分がエラーを発生させます:

Explanation: A user wants to access an other user's profile page. When this account is not yet activated the user that wanted to access, gets redirected to the root page (easy right?)

私が知っているコードが何をすべきこの仕事:

(app/controllers/users_controller.rb) 
def show 
    @user = User.find_by_id(params[:id]) 
    redirect_to root_url and return unless @user.activated? 
end 

私はいかなるエラーが発生することなく、activated?方法を使用している他の三つのコントローラのファイルがあります。しかし、この機会に、非アクティブ化されたユーザーのページにアクセスするとエラーが発生します。

これは、コンソールから出力されます。

Processing by UsersController#show as HTML 
Parameters: {"id"=>"101"} 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ?  
LIMIT 1 [["id", 101]] 
Completed 500 Internal Server Error in 2ms (ActiveRecord: 0.2ms) 

NoMethodError (undefined method `activated?' for nil:NilClass): 
app/controllers/users_controller.rb:12:in `show' 

エラーの原因は何?ユーザーはデータベース内にまだアクティブ化されていない(アクティブ化= false)。

編集:

エラーの原因となる問題が見つかりました。私はいくつかのアカウントを作ったが、これも削除した。それはうまくいったが、IDは最後に削除したIDから数え続ける。次のユーザーは101歳未満ではなく、107歳未満でした。データベースをリセットして、今すぐ動作します。もう一度データベースを見せてくれてありがとうsajinmp。

IDの問題は依然として残っていますが、これとは関係がないため、別のスレッドを作成します。

+0

ようこそスタックオーバーフロー。これはかなり冗長です。あなたの特定の質問についてもっと簡潔にするためにそれを減らしてください。最後のリンクを含む「[ask]」と「[mcve]」をお読みください。 –

+0

これは良いですか? – L03TJ3

+0

エラーは、データベースに関連するものです。フェッチによって内部サーバーエラーが返されます。だからあなたはユーザーを取得しませんでした。詳細が必要です。 'User.find(101)'とは何ですか? – sajinmp

答えて

1

エラーメッセージはundefined method 'activated?' for nil:NilClassです。これは、基本的にはactivated?nilと呼ぶことを意味します。前の行がユーザーを見つけられなかったようです。さらに、User.find(params[:id])も以前にエラーを起こしたと言っていました。これは、エントリが見つからない場合に行うべきであるfindでした。

データベースにid=101のユーザーがいない理由を調べる必要があります。そのユーザーを削除しましたか?そのメソッドに無効な値を渡しますか?どのようにそのメソッドへのリンクを生成しますか?

+0

だから、問題は最初の行にあります。ユーザーが明らかに見つからない行です。データベースには101人のユーザーがいます。最後のものとの唯一の違いは、この時点でfalseに設定されている列起動です。 それでもデータベースにあるので、ユーザーが見つからないというエラーが発生する原因は何ですか? – L03TJ3