ActiveRecord::RecordNotFound 在 PermitsController#show 中,找不到 'id'= 的许可
ActiveRecord::RecordNotFound in PermitsController#show, Couldn't find Permit with 'id'=
大家好,当我尝试访问应该显示特定用户的所有许可的 SHOW 操作(user/show.html.erb 上的管理许可按钮)时,我一直收到此错误,我搜索通过我所有的代码,找不到错误。你们能帮我看看我哪里做错了吗?顺便说一句,我正在 rails
上使用 Ruby 实现一个网站
这是我的permits_controller.rb
class PermitsController < ApplicationController
before_action :set_permit, only: [:show, :destroy]
def index
@permits = Permit.where(:user_id => current_user.id)
end
def new
@permits = Permit.new
end
def create
@permits = current_user.permits.build(permit_params)
if @permits.save
redirect_to invoice_path
else
render 'new'
end
end
def destroy
Permit.destroy_all(user_id: current_user)
respond_to do |format|
format.html { redirect_to root_path, notice: 'Permit was successfully canceled.' }
format.json { head :no_content }
end
end
def confirm
@fields = %i[vehicle_type, carplate, studentid, name, department, permitstart, permitend]
@permit = current_user.permits.build(permit_params)
render :new and return unless @permit.valid?
end
def show
@permits = Permit.where(:user_id => current_user.id)
end
def update
@permits = Permit.where(user_id: current_user).take
respond_to do |format|
if @permits.update(permit_params)
format.html { redirect_to root_path}
flash[:success] = "Permit successfully updated"
format.json { render :show, status: :ok, location: @user }
else
format.html { render :edit }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
def edit
@permits = Permit.find(params[:id])
#@permits = Permit.find_or_initialize_by(user_id: params[:id])
end
private
# Use callbacks to share common setup or constraints between actions.
def set_permit
@permits = Permit.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def permit_params
params.require(:permit).permit(:vehicle_type, :name, :studentid, :department, :carplate, :duration, :permitstart, :permitend)
end
end
这是我的permits/show.html.erb
<%= @permits.name %>
这是我的route.db
Rails.application.routes.draw do
resources :users
resources :permits do
collection do
post :confirm
end
end
resources :visitor_permits
root 'static_pages#home'
get 'invoice' => 'permits#invoice'
get 'payment' =>'transaction#new'
get 'show_visitor_permit' =>'visitor_permits#show'
get 'show_permit' =>'permits#show'
get 'visitorpermit' => 'visitor_permits#new'
post 'createpermit' => 'permits#create'
get 'homepage/index'
post 'permits' => 'permits#create'
get 'permitapplication' => 'permits#new'
get 'adminlogin' => 'admin_controller#index'
get 'patrollogin' => 'patrol_officer_controller#index'
get 'createcitation' => 'citations#new'
get 'contact'=> 'static_pages#contact'
get 'about' => 'static_pages#about'
get 'signup' => 'users#new'
get 'help' => 'static_pages#help'
post 'users' => 'users#create'
get 'login' => 'sessions#new' #Page for a new session
post 'login' => 'sessions#create' #Create a new session
delete 'logout'=>'sessions#destroy' #Delete a session
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
users/show.html.erb
<!DOCTYPE html>
<html>
<body>
<div id="sidebar">
<ul id="mySidenav" class="sidenav">
<li><%= link_to "New Parking Permit", permitapplication_path %></li>
<li><%= link_to "Manage Permit", show_permit_path(@permit) %></li>
<li><%= link_to "New Visitor Parking Permit", visitorpermit_path %></li>
<li><%= link_to "Manage Visitor Permit", "#" %></li>
<li><%= link_to "Check Fines", "#" %></li>
<li><%= link_to "New Health and Safety Report", "#" %></li>
<li><%= link_to "Manage Health and Safety Report", "#" %></li>
</ul>
</div>
</body>
</html>
在 PermitsController
中,您已经编写了设置许可的前操作
before_action :set_permit, only: [:show, :destroy]
def set_permit
@permits = Permit.find(params[:id])
end
因此,在设置许可时,如果数据库中的特定 id
不存在许可,则会引发异常 ActiveRecord::RecordNotFound
您还在 show action 中设置许可
def show
@permits = Permit.where(:user_id => current_user.id)
end
不确定为什么要为表演动作设置两次许可。
- 第一次在 set_permit
方法中
- 第二次 show
方法
能否添加随请求传递的相关参数。
分配记录两次不是好的做法。在您的情况下,在您通过 id
找到 Permit
之前,如果数据库中不存在该特定 id
的记录,那么它将引发 ActiveRecord::RecordNotFound
异常。所以你必须检查你传递的是什么 params[:id]
.
如果您想根据当前用户设置权限,您可以跳过 set_permit
显示操作。
并且在 show action 中,如果您分配的是 activerecord collection
而不是 active record
,在这种情况下,您必须遍历集合对象以打印 permit
详细信息。或者,如果用户只有一个许可,您可以在显示操作中设置 active record
对象而不是 active record collection
首先,您可以删除 before_action 中的 :show 方法,因为它会调用两个查询。
然后,如果您在活动记录查询中添加 where 条件(如下所示),它将返回记录数组而不是单个记录。
@permits = Permit.where(:user_id => current_user.id)
因此您不能直接将以下行放在您的视图中,因为对象数组不允许直接访问名称参数。
<%= @permits.name %>
也许您可以像下面这样迭代所有记录并填充每个 Permit 对象的名称。
<% @permits.each do |permit| %>
<%= permit.name %>
<% end %>
或者您可以执行如下操作以将其显示为逗号分隔。
<%= @permits.map { |f| f.name }.join ',' %>
如果你想在 @permits 中单独使用第一个对象,你可以像下面这样使用。
<%= @permits[0].name %>
P.S:注意第一个对象不存在会抛出异常
大家好,当我尝试访问应该显示特定用户的所有许可的 SHOW 操作(user/show.html.erb 上的管理许可按钮)时,我一直收到此错误,我搜索通过我所有的代码,找不到错误。你们能帮我看看我哪里做错了吗?顺便说一句,我正在 rails
上使用 Ruby 实现一个网站这是我的permits_controller.rb
class PermitsController < ApplicationController
before_action :set_permit, only: [:show, :destroy]
def index
@permits = Permit.where(:user_id => current_user.id)
end
def new
@permits = Permit.new
end
def create
@permits = current_user.permits.build(permit_params)
if @permits.save
redirect_to invoice_path
else
render 'new'
end
end
def destroy
Permit.destroy_all(user_id: current_user)
respond_to do |format|
format.html { redirect_to root_path, notice: 'Permit was successfully canceled.' }
format.json { head :no_content }
end
end
def confirm
@fields = %i[vehicle_type, carplate, studentid, name, department, permitstart, permitend]
@permit = current_user.permits.build(permit_params)
render :new and return unless @permit.valid?
end
def show
@permits = Permit.where(:user_id => current_user.id)
end
def update
@permits = Permit.where(user_id: current_user).take
respond_to do |format|
if @permits.update(permit_params)
format.html { redirect_to root_path}
flash[:success] = "Permit successfully updated"
format.json { render :show, status: :ok, location: @user }
else
format.html { render :edit }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
def edit
@permits = Permit.find(params[:id])
#@permits = Permit.find_or_initialize_by(user_id: params[:id])
end
private
# Use callbacks to share common setup or constraints between actions.
def set_permit
@permits = Permit.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def permit_params
params.require(:permit).permit(:vehicle_type, :name, :studentid, :department, :carplate, :duration, :permitstart, :permitend)
end
end
这是我的permits/show.html.erb
<%= @permits.name %>
这是我的route.db
Rails.application.routes.draw do
resources :users
resources :permits do
collection do
post :confirm
end
end
resources :visitor_permits
root 'static_pages#home'
get 'invoice' => 'permits#invoice'
get 'payment' =>'transaction#new'
get 'show_visitor_permit' =>'visitor_permits#show'
get 'show_permit' =>'permits#show'
get 'visitorpermit' => 'visitor_permits#new'
post 'createpermit' => 'permits#create'
get 'homepage/index'
post 'permits' => 'permits#create'
get 'permitapplication' => 'permits#new'
get 'adminlogin' => 'admin_controller#index'
get 'patrollogin' => 'patrol_officer_controller#index'
get 'createcitation' => 'citations#new'
get 'contact'=> 'static_pages#contact'
get 'about' => 'static_pages#about'
get 'signup' => 'users#new'
get 'help' => 'static_pages#help'
post 'users' => 'users#create'
get 'login' => 'sessions#new' #Page for a new session
post 'login' => 'sessions#create' #Create a new session
delete 'logout'=>'sessions#destroy' #Delete a session
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
users/show.html.erb
<!DOCTYPE html>
<html>
<body>
<div id="sidebar">
<ul id="mySidenav" class="sidenav">
<li><%= link_to "New Parking Permit", permitapplication_path %></li>
<li><%= link_to "Manage Permit", show_permit_path(@permit) %></li>
<li><%= link_to "New Visitor Parking Permit", visitorpermit_path %></li>
<li><%= link_to "Manage Visitor Permit", "#" %></li>
<li><%= link_to "Check Fines", "#" %></li>
<li><%= link_to "New Health and Safety Report", "#" %></li>
<li><%= link_to "Manage Health and Safety Report", "#" %></li>
</ul>
</div>
</body>
</html>
在 PermitsController
中,您已经编写了设置许可的前操作
before_action :set_permit, only: [:show, :destroy]
def set_permit
@permits = Permit.find(params[:id])
end
因此,在设置许可时,如果数据库中的特定 id
不存在许可,则会引发异常 ActiveRecord::RecordNotFound
您还在 show action 中设置许可
def show
@permits = Permit.where(:user_id => current_user.id)
end
不确定为什么要为表演动作设置两次许可。
- 第一次在 set_permit
方法中
- 第二次 show
方法
能否添加随请求传递的相关参数。
分配记录两次不是好的做法。在您的情况下,在您通过 id
找到 Permit
之前,如果数据库中不存在该特定 id
的记录,那么它将引发 ActiveRecord::RecordNotFound
异常。所以你必须检查你传递的是什么 params[:id]
.
如果您想根据当前用户设置权限,您可以跳过 set_permit
显示操作。
并且在 show action 中,如果您分配的是 activerecord collection
而不是 active record
,在这种情况下,您必须遍历集合对象以打印 permit
详细信息。或者,如果用户只有一个许可,您可以在显示操作中设置 active record
对象而不是 active record collection
首先,您可以删除 before_action 中的 :show 方法,因为它会调用两个查询。
然后,如果您在活动记录查询中添加 where 条件(如下所示),它将返回记录数组而不是单个记录。
@permits = Permit.where(:user_id => current_user.id)
因此您不能直接将以下行放在您的视图中,因为对象数组不允许直接访问名称参数。
<%= @permits.name %>
也许您可以像下面这样迭代所有记录并填充每个 Permit 对象的名称。
<% @permits.each do |permit| %>
<%= permit.name %>
<% end %>
或者您可以执行如下操作以将其显示为逗号分隔。
<%= @permits.map { |f| f.name }.join ',' %>
如果你想在 @permits 中单独使用第一个对象,你可以像下面这样使用。
<%= @permits[0].name %>
P.S:注意第一个对象不存在会抛出异常