0

当我试图破坏活动记录时,我遇到了一个奇怪的问题,它给出了这个错误。

AbstractController::ActionNotFound at /photos/6

The action 'destroy' could not be found for PhotosController

这是我的控制器的样子

class PhotosController < ApplicationController
     before_filter :authenticate_user!

....
....

  def delete
      @photo = current_user.photos.find(params[:id])
      @photo.destroy
      redirect_to photos_path
     end

如果我使用控制台执行相同的操作,它工作正常(记录被成功删除)。

这是我的路线文件的样子。

 resources :photos, :only => [:index, :show, :new, :create] do
   post 'upload', :on => :collection
 end

我知道我没有在资源中包含 :destroy 请建议我如何插入 :destroy 操作以删除照片

4

2 回答 2

0

如果你有照片资源,那么动作名称应该是销毁,而不是删除。如果没有,请检查您的路线。

以下是脚手架生成的七个默认操作

  1. 指数
  2. 新的
  3. 编辑
  4. 创造
  5. 更新
  6. 节目
  7. 销毁 # 不删除
于 2013-03-08T11:35:09.077 回答
0

我假设您正在使用resources :photo. 根据Rais 指南
该操作应该是destroy而不是。 七个默认操作是:delete
index, new, create, show, edit, update and destroy

 def destroy
  @photo = current_user.photos.find(params[:id])
  @photo.destroy
  redirect_to photos_path
 end

您还可以通过以下方式查看可用路线

rake routes

编辑

问题出在这里::only => [:index, :show, :new, :create],这对 rails 说:不要创建destroyeditupdate路由。

为了解决这个问题,你可以添加 destroy:only => [:index, :show, :new, :create, :destroy]或者使用:except:except => [:edit, :update]

如果您不想限制资源:

resources :photos do
  post 'upload', :on => :collection
end

编辑2 - 我真的不明白你为什么要尝试使用delete而不是destroy,但是,如果你有充分的理由:

resources :photos :only => [:index, :show, :new, :create] do
  post 'upload', :on => :collection
  get 'delete', :on => :member
end

通过这种方式,您将拥有delete_photo_path,可以在您的显示视图中使用:

<%= link_to 'Delete', delete_photo_path(@photo) %>

最后,删除操作应该如下所示:

def delete
  @photo = Photo.find(params[:id])
  @photo.destroy
  redirect_to photos_path
end
于 2013-03-08T11:28:34.333 回答