【问题标题】:ActiveRecord::RecordNotFound - Couldn't find User without an IDActiveRecord::RecordNotFound - 找不到没有 ID 的用户
【发布时间】:2012-03-07 16:25:36
【问题描述】:

遵循 Hartl 的 RailTutorial for Rails(3.2)。我不断收到此错误消息,或者奇怪的是“连接已重置”消息:

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

我正在尝试登录,成功登录后,我希望应用程序将用户重定向到 user/show.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'

编辑:添加了 session_helper.rb

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1


    【解决方案1】:

    我认为在会话控制器中的 def create 中你没有传递任何 id 。如果您有会话用户 ID,请传递它

    代码可以

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

    请检查 current_user 是否。像

    这样的渲染

    render :text =&gt; current_user.inspect and return false 在会话控制器之前

    redirect_to user_url(:session[:user_id])
    

    。如果它没有出现,则说明您的身份验证有问题。

    【讨论】:

    • 我尝试了上面的代码,但仍然收到同样的错误。正如 iltempo 指出的那样,我的实施中似乎存在问题。我添加了会话助手。
    【解决方案2】:

    在您的情况下,似乎 current_user 是 nil。让我们看看您的 UsersControllers 显示操作。它正在尝试查找 id = params[:id] 的用户记录,如果您的 url 是 users/show,则该记录未设置。 Find ActiveRecords find 方法期望找到一条记录,如果没有则抛出错误。

    尝试找出 current_user 评估为 nil 的原因。可能是您没有登录,或者您的实现中存在错误。

    【讨论】:

    • 另外,如果我的 url 是 users/show,您介意详细说明为什么 id = params[:id] 不会设置吗?我试过添加重定向和传递 id :id=&gt;session[:user_id] 但仍然有同样的错误。
    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多