2012-03-07 22 views
1

Hartl's Rail Tutorial for Rails(3.2)に従います。ActiveRecord :: RecordNotFound - IDなしでユーザーを見つけることができません

ActiveRecord::RecordNotFound in UsersController#show 
Couldn't find User without an ID 

私がログインしようとしていると正常にログインした後、私は、アプリケーションがユーザー/ショーにユーザーをリダイレクトしたい:私は、このエラーメッセージまたは奇妙な「接続がリセットされた」というメッセージを得続けます。 html.erb。私はユーザーのコントローラのshowメソッドで:idパラメータを渡していると思います。任意のヒント/助けをいただければ幸いです!

以下の関連ファイルを貼り付けました。あなたに何か他のものが必要な場合は教えてください。

sessions_controller.rb

class SessionsController < ApplicationController 

def new 
    @title = "Log in" 
end 

def create 
    user = User.find_by_email(params[:session][:email])    
    if user.nil? 
    flash.now[:error] = "Invalid email/password combination." 
     @title = "Sign in" 
     render 'new' 
    else 
    flash.now[:success] = "Successful login!" 
    sign_in user 
     redirect_to 'users/show' 
    end 
end 

def destroy 
    sign_out 
    redirect_to root_path[:name] 
end 
end 

users_controller.rb

class UsersController < ApplicationController 


def new 
    @user = User.new 
    @title = "Sign up" 
end 

def show 
    if params[:id].nil? && current_user 
    @user = current_user 
    else 
    @user = User.find(params[:id]) 
    end 
    @title = @user.name 
    end 


def create 
    @user = User.new(params[:user]) 
    if @user.save 
    sign_in @user 
    flash[:success] = "Account created!" 
    redirect_to @user 
    else 
    @title = "Sign up" 
    render 'new' 
    end 
    end 

def destroy 
    @user.destroy 
    redirect_to users_path, :flash => { :success => "User destroyed." } 
end 

end 

routes.rbを

SampleApp::Application.routes.draw do 

    resources :users 
    resources :sessions, :only => [:new, :create, :destroy] 


    match '/sessions', :to => 'users#show' 
    match '/signup', :to => 'users#new' 
    match '/login', :to => 'sessions#new' 
    match '/logout', :to => 'sessions#destroy' 

    root :to => 'pages#home' 

編集:

module SessionsHelper 

def sign_in(user) 
    cookies.permanent.signed[:remember_token] = user.remember_token 
    current_user = user 
end 


def signed_in? 
    !current_user.nil? 
end 

def current_user=(user) 
    @current_user = user 
end 

def current_user 
    @current_user ||= user_from_remember_token 
end 


def sign_out 
    cookies.delete(:remember_token) 
    current_user = nil 
end 

private 

def user_from_remember_token 
    remember_token = cookies[:remember_token] 
    User.find_by_remember_token(remember_token) unless remember_token.nil? 
end 



end 
sessions_helper.rbを追加しました210

答えて

3

私はあなたが任意のIDを渡されていないセッションコントローラでdefを作成すると思います。セッションのユーザIDをお持ちの場合は

コードが

redirect_to 'user/show' , :id => session[:user_id] 
redirect_to user_url(:session[:user_id]) 

することができ、それに合格してくださいあなたはCURRENT_USERがあることを確認してくださいことができます。

redirect_to user_url(:session[:user_id]) 

前に、セッションコントローラに

render :text => current_user.inspect and return false のようにレンダリングしています。それが来なければ、あなたの認証に問題があります。

+0

上記のコードを試しましたが、引き続き同じエラーが発生しました。 iltempoによって指摘されている私の実装に問題があるように見えます。セッションヘルパーを追加しました。 – Huy

+0

私の答えを編集しました。もう一度ご確認ください –

+0

ご協力ありがとうございます! – Huy

1

あなたのケースでは、current_userのようなものはnilです。あなたのUsersControllersの動作を見てみましょう。あなたのURLがのユーザー/表示である場合に設定されていないid = params[:id]のユーザーレコードを検索しようとしています。 Find ActiveRecords findメソッドは、レコードを見つけると予想し、そうでない場合はエラーをスローします。

current_userが評価されない理由を調べてみてください。あなたはログインしていないか、実装にバグがあるかもしれません。

+0

私はsessions_helper.rbを追加しました。しかし、何が起こっているのかは分かりません... – Huy

+0

また、私のURLがusers/showの場合、id = params [:id]が設定されない理由について詳しく説明していますか?私はリダイレクトを追加し、ID ':id => session [:user_id]'を渡そうとしましたが、依然として同じエラーがあります。 – Huy