Ruby on rails 4 RubyonRails 4:删除用户触发器错误
每当我试图删除一个用户时,就会出现错误:Ruby on rails 4 RubyonRails 4:删除用户触发器错误,ruby-on-rails-4,rails-activerecord,crud,Ruby On Rails 4,Rails Activerecord,Crud,每当我试图删除一个用户时,就会出现错误:找不到id=8的用户。错误指向“当前用户”方法中的application\u controller.rb中的一行:ActiveRecord::RecordNotFound at/users。“/users”是我试图重定向到的位置 我不知道我错在哪里。我想知道在application.html.erb文件中是否缺少 应用程序\u控制器.rb def current_user @current_user ||= User.find(session[:user
找不到id=8的用户。错误指向“当前用户”方法中的application\u controller.rb
中的一行:ActiveRecord::RecordNotFound at/users
。“/users”是我试图重定向到的位置
我不知道我错在哪里。我想知道在application.html.erb文件中是否缺少
应用程序\u控制器.rb
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
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
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
<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 %>
用户\u控制器.rb
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
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
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
<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 %>
会话\u controller.rb
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
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
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
<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 %>
class sessioncontroller
views/users/show.html.erb
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
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
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
<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 %>
@
#对当前用户可见
如果你需要更多的文件,请告诉我
我觉得这是一个简单的解决办法。请帮忙。提前谢谢你 我猜如果应用程序控制器中存在bug,请在用户控制器的销毁方法中添加以下代码:
会话[:user\u id]=如果当前用户==@user,则为零
这样,如果您删除当前连接的用户,它将被注销。当您对不存在的记录id使用find
时,ActiveRecord抛出ActiveRecord::RecordNotFound
异常。您可以通过使用find_by
来解决这个问题,它将返回nil
。因此,请在您的应用程序_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
如果会话中的用户id不是无效用户,则第二个仍将引发异常
希望这能有所帮助对不起,我不太清楚“堆栈跟踪”到底是什么意思……对于RoR和编程来说,总体来说还是相当陌生的。