Неизвестное действие в контроллере - 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,

Другие вопросы по тегам