2

Cancan を使用してコメント リソースを承認し、認証するように工夫しています。私は次のコントローラーを持っています.deviseを使用してサインインしていないときに新しいコメントを投稿しようとすると、コメントを作成するにはサインインする必要があるため、ユーザーはサインインページ(new_user_session_path)にリダイレクトされます。remote: trueただし、サインインせずに新しいコメントを投稿すると、アクションが実行されcreate.js.erb、Chrome コンソールで 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 に答える