2

我正在使用 Cancan 来授权我的评论资源并设计进行身份验证。我有以下控制器,当我没有使用 devise 登录并尝试发布新评论时,用户将被重定向到登录页面(new_user_session_path),因为他们必须登录才能创建评论。但是,如果我在未登录的情况下发布新的评论使用remote: true,它会通过在 Chrome 控制台中渲染create.js.erb并使用 html 响应,并在解析时出现错误@comments.any?,这应该是 nil。但是,如果用户尚未登录但想提交评论,我想获得类似 :unauthorized 或 501 的状态代码,因此我可以使用 jQuery 捕获它并调出登录表单。我以为gem cancan提供的load_and_authorize_resource甚至会阻止我的请求执行该操作,但显然不是。我应该怎么做才能获得状态响应而不是采取行动?谢谢!

class CommentsController < ApplicationController
  load_and_authorize_resource
  #should I also add a devise authenticate_user! before filter here?

  def create
    @commentable = find_commentable
    @comment = current_user.comments.build(params[:comment].merge(:commentable => @commentable))
    if @comment.save
      respond_to do |format|
        format.html { redirect_to @commentable, :notice => "Successfully created comment."}
        format.js   {@comments = @commentable.comments}
      end
    else
      respond_to do |format|
        format.html { redirect_to @commentable, :notice => "Comment NOT created."}
        format.js   { render :status => :internal_server_error }
      end
    end
  end
end
4

1 回答 1

0

我会将您的控制器修改为:

class CommentsController < ApplicationControlle

  def create
    @commentable = find_commentable
    authorize! :create, @commentable
    @comment = current_user.comments.build(params[:comment].merge(:commentable => @commentable))
    if @comment.save
      respond_to do |format|
        format.html { redirect_to @commentable, :notice => "Successfully created comment."}
        format.js   {@comments = @commentable.comments}
      end
    end
  end
end

如果您的用户已获得授权,则会出现您的成功消息。否则,当未经授权的用户尝试发表评论时,将出现 501 消息。

于 2013-02-10T18:31:44.330 回答