我正在关注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(我做的第一个用户可能在之前的测试运行期间被删除)。
应用程序/控制器/ users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
def new
end
end
应用程序/配置/ 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或任意其他任意分配)?
谢谢!
答案 0 :(得分:1)
无需关心从数据库中删除的数据。而且你永远不需要去参观&#34; show&#34;在浏览器中按类型URL查看。例如,您可能想要创建一个索引视图,显示所有用户。
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,并将您重定向到右侧页面。
如果您确实要输入一些类似于#34; yourlocalhost / users / 1&#34;在您的浏览器中,获得您提到的错误是合理的。您可以更好地添加一些错误处理,而不是尝试使该网址按预期工作。例如,抢救该错误以将用户重定向到某个页面,然后向他们显示通知:&#34;抱歉,该页面不存在,请访问其他页面。 :P&#34;
通常,在数据库中重复使用通过删除记录释放的ID并不是一个好主意。因为它很容易引起问题。例如,如果数据库中有其他表,则使用&#34; user_id&#34;柱。它可能有冲突。
答案 1 :(得分:1)
可以为记录的id分配一个新值并保存。
但这是一种非常糟糕的做法。
首先,它会破坏你的记录关联,这些关联都是基于你的记录的主键。
其次,它可能导致重复的主键,通过分配将在稍后使用的ID或通过分配已在使用的ID。因此,您的数据库将不允许现在或以后保存记录。
主键的意义在于它除了作为记录的唯一标识之外没有其固有的含义或意义......所以你永远不应该关心主键的价值或特征,所以你永远不应该任何改变它的需要。
答案 2 :(得分:1)
在我的意见中,你必须通过传递条件来重定向到你的用户索引页面,从而卵形你的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时,它会获得用户想要的意外数据