抽象控制器::ActionNotFound - 找不到操作'destroy'



我的rails应用程序遇到了一些麻烦。我检查了这个错误的其他问题,没有一个问题适用于我的申请。

我需要销毁一行,为了做到这一点,我在我的控制器中指示一个窗体的"销毁"动作。

这是我指导的地方。

<%= 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操作,您希望在路由中使用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_to 'Delete', mycontroller_path(object_to_destroy), method: :delete %>

你需要把你的destroy动作添加到你的路由中。

添加以下行:resources :pallet_hists到您的config/routes.rb将解决问题。这将添加所有路由(update, index, create…)。

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

最新更新