首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveRecord::RecordNotFound在PermitsController#show中,无法找到带有'id'=的许可

ActiveRecord::RecordNotFound在PermitsController#show中,无法找到带有'id'=的许可
EN

Stack Overflow用户
提问于 2016-10-08 07:25:50
回答 2查看 156关注 0票数 0

嗨,伙计们,当我试图访问显示操作(在user /show.html.erb上管理许可按钮)时,我一直会收到这个错误,它应该显示特定用户的所有许可,我搜索我的所有代码,却找不到bug。你们能帮我查一下我哪部分做错了吗?顺便说一下,我正在用rails实现一个网站

这是我的permits_controller.rb

代码语言:javascript
复制
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

这是我的许可证/show.html.erb

代码语言:javascript
复制
<%= @permits.name %>

这是我的route.db

代码语言:javascript
复制
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

用户/show.html.erb

代码语言:javascript
复制
<!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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-08 07:47:14

首先,可以在before_action中删除:show方法,因为它将调用两个查询。

然后,如果在活动记录查询中添加where条件(如下面所示),它将导致记录数组而不是单个记录。

代码语言:javascript
复制
@permits = Permit.where(:user_id => current_user.id)

因此,您不能直接将下面的行放在视图中,因为对象数组将不允许直接访问name参数。

代码语言:javascript
复制
<%= @permits.name %>

您可以像下面这样迭代所有记录,并填充每个许可证对象的名称。

代码语言:javascript
复制
<% @permits.each do |permit| %>
   <%= permit.name %>
<% end %>

或者你可以在下面这样做,把它显示为逗号分隔。

代码语言:javascript
复制
<%= @permits.map { |f| f.name }.join ',' %>

如果您希望在@许可证中单独使用第一个对象,您可以使用如下所示。

代码语言:javascript
复制
<%= @permits[0].name %>

注意,如果第一个对象不存在,它将引发异常。

票数 2
EN

Stack Overflow用户

发布于 2016-10-08 07:36:29

PermitsController中,您已经编写了设置许可证的前一步操作。

代码语言:javascript
复制
  before_action :set_permit, only: [:show, :destroy]


  def set_permit
    @permits = Permit.find(params[:id])
  end

因此,在设置许可证时,如果DB中没有特定的id,则会引发异常ActiveRecord::RecordNotFound

您还将在表演活动中设置许可证。

代码语言:javascript
复制
  def show
    @permits = Permit.where(:user_id => current_user.id)
  end

不确定为什么要为表演设置两次许可证。-第一次在set_permit方法中,第二次在show方法中

请您添加与请求一起传递的有关参数。

分配记录两次是不好的做法。在您的情况下,在操作前,您正在通过Permit找到id,如果数据库中没有该特定id的记录,那么它将引发ActiveRecord::RecordNotFound异常。因此,您必须检查您在params[:id]中传递的内容。

如果要根据当前用户设置许可证,可以跳过set_permit进行显示操作。

在显示操作中,如果您指定的是activerecord collection而不是active record,那么在视图中,您必须遍历集合对象来打印permit详细信息。或者,如果只有一个允许用户使用的许可,则可以在“显示操作”中设置active record对象,而不是active record collection

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39929849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档