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 不是无效用户,第二个仍会引发异常。
希望对您有所帮助
每当我尝试删除用户时,我都会收到错误消息: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 不是无效用户,第二个仍会引发异常。
希望对您有所帮助