ActiveRecord::RecordNotFound в PermitsController #detail, не удалось найти разрешение с помощью ‘id’ =

#ruby-on-rails #ruby #ruby-on-rails-5

#ruby-on-rails #ruby #ruby-on-rails-5

Вопрос:

Привет, ребята, я продолжаю получать эту ошибку, когда пытаюсь получить доступ к отображению данных одного конкретного разрешения из модели разрешений в detail.html.erb, я просматриваю весь свой код и не могу найти ошибку. Можете ли вы, ребята, помочь мне проверить, какую часть я сделал неправильно? Кстати, я внедряю веб-сайт с использованием Ruby on rails

Это мой permits_controller.rb

 class PermitsController < ApplicationController
  before_action :set_permit, only: [: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
  def detail
    @permits = Permit.find(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
  

Detail.html.erb

 <% provide(:title, 'New Permit') %>
<h1>Permit Application</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">


        <h2><%= @permits.permitstart %></h2>

  </div>
</div>
  

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 'viewpermit' =>'permits#detail'

  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)

 <h2>My Permits</h2>
<table>
  <tr>
    <th>Permit Start Date</th>
    <th>Permit End Data</th>
    <th>Action</th>
    <th> </th>
  </tr>
<% @permits.each do |permit| %>

  <tr>
    <td><%= permit.permitstart %></td>
    <td><%= permit.permitend %></td>
    <td><%= link_to 'Detail', viewpermit_path(permit) %></td>
    <td><%= link_to 'Edit', edit_permit_path(permit) %></td>
  </tr>

<% end %>

</table>
  

Комментарии:

1. Кажется, не существует разрешения с идентификатором, который вы передаете.

2. Да, но действие РЕДАКТИРОВАНИЯ в моем контроллере фактически выполняет то же самое, также выводит данные. Оба действия выполняют одно и то же, различия заключаются в том, что РЕДАКТИРОВАНИЕ выводит данные в текстовое поле, в то время как DETAIL выводит данные на страницу в виде обычного текста. Я сделал то же самое, что и РЕДАКТИРОВАТЬ, но это не работает

3. detail это пользовательское действие. Вы правильно настроили свои маршруты? Как выглядит ваша ссылка?

4. Обновил мой вопрос 🙂

Ответ №1:

Вы неправильно определили свои маршруты. Ваши маршруты просто перенаправляют на действие #detail , но вы не устанавливаете свои переменные в маршруте. У вас есть несколько вариантов

 resources :permits do
  collection do
    post :confirm
  end

  member do
    get 'viewpermit' # enables a route like /permits/1/viewpermit
  end
end

# or

get 'viewpermit/:id' => 'permits#detail' #enables route /viewpermit/1
  

Комментарии:

1. Я попробовал ваше решение, но я вернул эту ошибку NoMethodError в Permits#show

2. Не могли бы вы, пожалуйста, немного конкретнее, что вы пробовали? Пример всего маршрута или только часть? Какой метод отсутствует? NoMethodError обычно метод именуется отсутствующим. Когда вы получаете эту ошибку? Вы проверили свою Detail ссылку? Как выглядит эта ссылка?

3. Я попробовал 1-е и 2-е решение, которые заменяют get ‘viewpermit’ =>’permits#show’ в моем файле маршрута, затем я получил эту ошибку Ошибка маршрутизации Маршрут не совпадает [GET] «/ viewpermit.2»

4. Это верно, потому что маршрут должен быть /viewpermit/2 вы пробовали этот URL вручную или перейдя по ссылке? Как вы генерируете этот URL-адрес? Вы перезагружали страницу после изменения маршрутов?

5. Попробуйте ` viewpermit_path(идентификатор: permit.id )`

Ответ №2:

Редактировать:

В вашем show действии.заменить where на find

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

Комментарии:

1. После замены я получаю эту новую ошибку ActiveRecord::RecordNotFound в PermitsController #показать Не удалось найти разрешение с помощью ‘id’ ={: user_id=> 1} . Я думаю, что проблема должна быть в действии DETAIL .