Ruby on Rails 4: 删除用户触发错误

Ruby on Rails 4: Deleting user triggers error

每当我尝试删除用户时,我都会收到错误消息:Couldn't find User with 'id'=8。错误指向 "current_user" 方法中 application_controller.rb 的一行:ActiveRecord::RecordNotFound at /users。 “/users” 是我要 redirect_to.

的地方

我不知道我哪里错了。我想知道 application.html.erb file.

中是否缺少 <%= javascript_include_tag ... %>

application_controller.rb

def current_user
 @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

users_controller.rb

def delete
 @user = User.find(params[:id])
end

def destroy
 @user = User.find(params[:id]).destroy
 flash[:warning] = '#{@user.name} has been deleted.'
 redirect_to users_path
end

sessions_controller.rb

class SessionsController < ApplicationController

 def create
    user = User.find_by(email: params[:email]) 
    if user && user.authenticate(params[:password])
        session[:user_id] = user.id

            if request.referrer == login_url
                redirect_to root_path
            else
                redirect_to :back
            end             

    else
        flash.now[:danger] = "Email and password did not match. Please try again."
        render :new
    end
 end

 def destroy
    session[:user_id] = nil
    flash[:success] = "Logged out."
    redirect_to :back
 end

end

views/users/show.html.erb

<p id="notice"><%= notice %></p>
<h2 id="page-title"><%= @user.name %> <small>@<%= @user.username %></small>
    <div class="small pull-right"></div>
</h2>

<hr/>

<% @user.types.each do |type| %>
    <h4><small><%= type.name %></small></h4>
<% end %>

    <% if current_user == @user %> # visible to current_user
        <div class="float-right">

            <%= link_to 'Edit', edit_user_path(@user), class: 'btn btn-default' %>
            <%= link_to 'Delete Account', user_path, 
                    data: { confirm: 'Are you sure you want to delete your account forever?' }, 
                    method: :delete, class: 'btn btn-danger' %>
        </div>
    <% end %>

如果您需要更多文件,请告诉我。

我觉得这是一个简单的修复。请帮忙。提前谢谢你!

我猜是不是application controller有bug,在user controller的destroy方法中添加如下代码:

session[:user_id] = nil if current_user == @user

这样,如果您删除当前连接的用户,它将被注销。

当您将 find 与不存在的记录 ID 一起使用时,ActiveRecord 会抛出 ActiveRecord::RecordNotFound 异常。您可以使用 find_by 来解决这个问题,这将 return nil。所以在你的 application_controller.rb

中试试这个
def current_user
 @current_user ||= User.find_by(id: session[:user_id])
end

或者您可以通过这样做更正确地使用支票

def current_user
 @current_user ||= (session[:user_id].present? && User.find(session[:user_id]))
end

如果会话中的 user_id 不是无效用户,第二个仍会引发异常。

希望对您有所帮助