解决 UsersController#show Couldn't find User with 'id'=1when that id when the id was previously deleted

Resolving UsersController#show Couldn't find User with 'id'=1when that id was previously deleted

我正在学习 Michael Hartl 的教程。我收到以下错误:

ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User with 'id'=1

Extracted source (around line #155)
    record = s.execute([id], self, connection).first
    unless record
      raise RecordNotFound, "Couldn't find #{name} with '#{primary_key}'=#{id}"
    end
    record
  rescue RangeError

已经尝试捆绑安装并重新启动服务器,因为初始错误与 bcrypt Gemfile(使用 v 3.1.7)有关。

运行 rails 控制台并输入 User.find(1) 没有用户。但是,rails c 中的 User.all 确实显示我有一个用户,但它有一个 id:2(我创建的第一个用户可能在之前的测试运行中被删除了)。

app/controllers/users_controller.rb

class UsersController < ApplicationController

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

 def new
 end
end

app/config/routes.rb Rails.application.routes.draw做

  get 'users/new'

  root 'static_pages#home'
  get 'help' => 'static_pages#help'
  get 'about' => 'static_pages#about'
  get 'contact' => 'static_pages#contact'
  get 'signup' => 'users#new'
  resources :users

end

目前 URL/users/2 按预期显示 调试显示:

 --- !ruby/hash:ActionController::Parameters
 controller: users
 action: show
 id: '2'

但是,id: 1 不是这种情况,因为它之前已被销毁。

是否可以在创建数据库后重新分配数据库中的 ID(即,像 1 这样的先前 ID 或任何其他任意分配)?

谢谢!

无需关心您从数据库中删除的数据。而且您永远不需要在浏览器中输入 url 来访问 "show" 视图。例如,您可能想要创建一个索引视图,显示所有用户。

class UsersController < ApplicationController
  def index
    @users = User.all
  end

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

  def new
  end
end

<% # "app/views/users/index.html.erb" %>
<% @users.each do |user| %>
  <%= link_to "user.name", users_path(user) %>
<% end %>

当您单击索引页中的链接时,Rails 会自动查找用户 ID 并将您重定向到正确的页面。

如果您确实想在浏览器中输入一些 url,例如 "yourlocalhost/users/1",出现您提到的错误是合理的。与其尝试使 url 按预期工作,不如添加一些错误处理。例如,挽救该错误以将您的用户重定向到某个页面,然后向他们显示通知:"Sorry man, that page is not exist, please visit other page. :P"

一般来说,在您通过删除记录释放的数据库中重复使用 id 不是一个好主意。因为很容易出问题。例如,如果您的数据库中还有其他表,其中包含 "user_id" 列。可能有冲突。

可以为记录的 ID 分配一个新值并保存它。

但这是一个非常糟糕的做法。

首先,它几乎会破坏所有基于记录主键的记录关联。

其次,它可能会导致重复的主键,要么分配一个将在以后使用的 id,要么分配一个已经在使用的 id。因此,您的数据库将不允许现在或以后保存记录。

主键的要点是它除了作为记录的唯一标识符外没有任何内在意义或意义...所以你永远不应该关心主键的值或特征,所以你应该永远不需要改变它。

在我看来,您必须通过传递条件以重定向到您的用户索引页面来避免您的 nil 值。这条路是通常的路。

class UsersController < ApplicationController
  def index
    @users = User.all
  end

  def show
    @user = User.find_by(id: params[:id])
     if @user.nil?
        redirect_to users_path
     end
  end

  def new
  end
end

尝试让用户知道获取正确的数据,因为当传递到另一个 ID 时,它会得到用户想要的意外数据