具有嵌套资源和销毁的RoutingError

时间:2012-02-28 07:00:26

标签: ruby-on-rails

我遇到了一种奇怪的情况,我在嵌套资源上遇到了一个奇怪的错误。

我有一个嵌套资源,如下所示:

resources :users do
  resources :comments, :only => [:create, :destroy]
end

我的评论终点是json,所以它的控制器定义如下。请注意,我正在使用cancan和actsAsApi gems。

class CommentsController < ApplicationController
  load_and_authorize_resource

  self.responder = ActsAsApi::Responder
  respond_to :json

  # POST /comments.json
  def create
    flash[:notice] = 'Comment was successfully created.' if @comment.save
    respond_with(@comment, :api_template => :default)
  end

  # DELETE /comments/1.json
  def destroy
    @comment.destroy
    respond_with(@comment, :api_template => :default)
  end

然后,我可以使用一些请求参数向'/users/1/comments.json'发送一个帖子请求,评论将按预期创建。不幸的是,我在尝试找到销毁操作时遇到错误:

Completed 404 Not Found in 169ms

ActionController::RoutingError (No route matches {:action=>"destroy", :controller=>"comments", :id=>#<Comment id: 34, user_id: 1, text: "test test test", created_at: "2012-02-28 06:45:49", updated_at: "2012-02-28 06:45:49">}):
  app/controllers/comments_controller.rb:12:in `create'

作为额外信息,如果我将routes.rb修改为:

resources :comments, :only => [:destroy]
resources :users do
  resources :comments, :only => [:create]
end

我没有看到任何错误。

2 个答案:

答案 0 :(得分:0)

因为您正在使用嵌套资源,所以您需要告诉cancan加载用户和注释操作的注释以便工作。

见如下:

class CommentsController < ApplicationController
  load_and_authorize_resource :user
  load_and_authorize_resource :comment, :through => :user
end

查看有关cancan nested resource page

的更多详情

答案 1 :(得分:0)

我能够弄清楚这一点。基本上,当您嵌套资源时,您需要使用respond_with,如下所示:

respond_with(@comment.note, @comment, :api_template => :default)