Неизвестное действие в контроллере - route.rb? странные результаты при переходе от единственного числа к множественному?
Я получаю странную реакцию на мой метод уничтожения. Я получаю эту ошибку при попытке уничтожить проект:
Unknown action
The action '5' could not be found for ProjectsController
Я разобрался, когда, когда я меняю свой файл rout.rb с resources :projects
(множественное число) в resources :project
(единственное), действие уничтожения работает как надо (и возвращает к индексу), но тогда мой метод show работает, но update и новые методы бросают undefined method
Ошибки projects_path'а. Почему это происходит??
class ProjectsController < ApplicationController
def index
@projects = Project.sorted
end
def show
@project = Project.find(params[:id])
end
def new
@project = Project.new
@project_count = Project.count + 1
end
def create
# Instantiate a new object using form parameters
@project = Project.new(project_params)
# Save the object
if @project.save
# If save succeeds, redirect to the index action
flash[:notice] = "Project created successfully."
redirect_to(:action => 'index')
else
# If save fails, redisplay the form so user can fix problems
@project_count = Project.count + 1
render('new')
end
end
def edit
@project = Project.find(params[:id])
@project_count = Project.count
end
def update
@project = Project.find(params[:id])
if @project.update_attributes(project_params)
flash[:notice] = "Project updated successfully."
redirect_to(:action => 'show', :id => @project.id)
else
@project_count = Project.count
render('edit')
end
end
def delete
@project = Project.find(params[:id])
end
def destroy
project = Project.find(params[:id])
project.destroy
flash[:notice] = "Project '#{project.name}' destroyed successfully."
redirect_to(:action => 'index')
end
private
def project_params
params.require(:project).permit(:name, :financing, :visible, :position)
end
end
Файл route.rb:
Rails.application.routes.draw do
root :to => 'projects#index'
resources :projects
match ':controller(/:action(/:id))', :via => [:get, :post]
# The priority is based upon order of creation: first created -> highest priority.
# See how all your routes lay out with "rake routes".
# You can have the root of your site routed with "root"
# root 'welcome#index'
# Example of regular route:
# get 'products/:id' => 'catalog#view'
# Example of named route that can be invoked with purchase_url(id: product.id)
# get 'products/:id/purchase' => 'catalog#purchase', as: :purchase
# Exampl
e resource route (maps HTTP verbs to controller actions automatically):
# resources :products
# Example resource route with options:
# resources :products do
# member do
# get 'short'
# post 'toggle'
# end
#
# collection do
# get 'sold'
# end
# end
# Example resource route with sub-resources:
# resources :products do
# resources :comments, :sales
# resource :seller
# end
# Example resource route with more complex sub-resources:
# resources :products do
# resources :comments
# resources :sales do
# get 'recent', on: :collection
# end
# end
# Example resource route with concerns:
# concern :toggleable do
# post 'toggle'
# end
# resources :posts, concerns: :toggleable
# resources :photos, concerns: :toggleable
# Example resource route within a namespace:
# namespace :admin do
# # Directs /admin/products/* to Admin::ProductsController
# # (app/controllers/admin/products_controller.rb)
# resources :products
# end
end
Страница Delete.html.erb:
<% @page_title = "Delete Project" %>
<%= link_to("<< Back to List", {:action => 'index'}, :class => 'back-link') %>
<div class="project destroy">
<h2>Delete Projects</h2>
<%= form_for(:project, :url => {:action => 'destroy', :id => @project.id}) do |f| %>
<p>Are you sure you want to permanently delete this project?</p>
<p class="reference-name"><%= @project.name %></p>
<div class="form-buttons">
<%= submit_tag("Delete Project") %>
</div>
<% end %>
</div>
[ОБНОВЛЕНИЕ] Еще одно интересное обновление. Я возился с уничтожением и изменил контроллер на:
def delete
@project = Project.find(params[:id])
@project.destroy
end
def destroy
project = Project.find(params[:id])
project.destroy
flash[:notice] = "Project '#{project.name}' destroyed successfully."
redirect_to(:action => 'index')
end
Я сделал это, чтобы увидеть, если это была проблема с методом уничтожения. Он уничтожает проект и по-прежнему возвращает страницу удаления, которая вызывает ту же ошибку, но уничтожает ее.
1 ответ
Хотя вы делаете пару нетрадиционных вещей, таких как delete.html.erb
(объекты удаляются со страницы просмотра шоу), я собираюсь ответить на ваш прямой вопрос.
вы сказали:
"Когда я изменяю свой файл rout.rb из ресурсов: проекты (множественное число) на ресурсы: проект (единственное), действие уничтожения работает, как должно (и возвращается к индексу), но тогда мой метод show работает, но обновление и новые методы выбрасывают неопределенные ошибки метода projects_path'`. Почему это происходит??"
вы понимаете, что каждый раз, когда вы изменяете свои маршруты, вы должны изменять вспомогательные пути в своих представлениях.
пример: когда вы имели resources :projects
, у вас вспомогательные методы были (запустите rake db:migrate)
projects_path GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project_path GET /projects/new(.:format) projects#new
edit_project_path GET /projects/:id/edit(.:format) projects#edit
project_path GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy
Итак, на данный момент, projects_path
работал, потому что, как вы можете видеть выше, projects_path
есть.
когда вы изменили свои маршруты на resources :project
(единственное число), ваши пути помощников также меняются. бежать rake db:migrate
чтобы увидеть их:
project_index_path GET /project(.:format) project#index
POST /project(.:format) project#create
GET /project/new(.:format) project#new
GET /project/:id/edit(.:format) project#edit
GET /project/:id(.:format) project#show
PATCH /project/:id(.:format) project#update
PUT /project/:id(.:format) project#update
DELETE /project/:id(.:format) project#destroy
Как вы можете видеть вспомогательный путь, который отображается на project#index
является project_index_path
,
Так что я угадал в вашем edit.html.erb
(или где-то еще) у вас есть старый код: projects_path
и так вы получаете undefined method projects_path
потому что помощник больше не существует. Правильный вспомогательный метод в этом случае project_index_path
,