#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 .