AbstractController::ActionNotFound - 找不到操作 'destroy'

AbstractController::ActionNotFound - The action 'destroy' could not be found

我的 rails 应用程序遇到了一些问题。我检查了这个错误的其他问题,其中 none 个适用于我的应用程序。

我需要销毁一行,为此我将一个表单指向控制器中的操作 'destroy'。

这里是我指挥它的地方。

<%= form_for(:pallet_hist, :url => {:action => 'destroy', :id => params[:id]}) do |f| %>

这是控制器中的动作。

class PalletHistController < ApplicationController

def destroy
    @pallet_hist = PalletHist.find(params[:id]).destroy
    flash[:notice] = "Entry '#{pallet_hist.id}' deleted successfully"
    redirect_to(:action => 'index', :id => @pallet_hist.pallet_id)
  end
end

我不明白为什么它仍然给我这个错误。

Routes.rb

Rails.application.routes.draw do

  match ':controller(/:action(/:id))', :via => [:get, :post] 

  root 'pallets#index'
end

您需要将 destroy 操作添加到路线中。

添加以下行:resources :pallet_hists 到您的 config/routes.rb 将解决 problem.This 将添加所有路由(updateindexcreate...).

如果只想添加 destroy 路由,可以使用 resources :pallet_hists, only: :destroy

对于销毁操作,您想在路由中使用 delete HTTP 方法。所以对于自定义路由(如果你不使用 resources 来生成一组路由)它会是这样的:

delete 'my_url', to: 'mycontroller#my_delete_action'

如果您要使用 resources,它将为您提供索引、显示、新建、创建、编辑、更新和销毁路线。

此外,如果您的 :url => {:action => 'destroy', :id => params[:id]} 有效,我会感到很惊讶。 url: 选项 应该 包含销毁操作的 url。因此,如果您执行我上面提到的自定义路线,url 将更接近 mycontroller_path,然后应该有一个 method: :delete。我在最后一部分可能是错的,但我想我会提供额外的信息以防我是对的。

编辑:

如果您只需要一个删除按钮,那么您可能不想为此创建一个表单。你最好使用 link。所以这将是这样的:

<%= link_to 'Delete', mycontroller_path(object_to_destroy), method: :delete %>

希望对您有所帮助。