我遇到了一种奇怪的情况,我在嵌套资源上遇到了一个奇怪的错误。
我有一个嵌套资源,如下所示:
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
我没有看到任何错误。
答案 0 :(得分:0)
因为您正在使用嵌套资源,所以您需要告诉cancan加载用户和注释操作的注释以便工作。
见如下:
class CommentsController < ApplicationController
load_and_authorize_resource :user
load_and_authorize_resource :comment, :through => :user
end
的更多详情
答案 1 :(得分:0)
我能够弄清楚这一点。基本上,当您嵌套资源时,您需要使用respond_with,如下所示:
respond_with(@comment.note, @comment, :api_template => :default)