0

ポストコントローラーの私のコードは次のとおりです。私がやろうとしているのは、ユーザーが自分の投稿を削除できるようにし、admin_user が任意の投稿を削除できるようにすることです。次のコードは、admin_user が投稿を削除できるようにしますが、通常のユーザーが自分の投稿を削除しようとすると、root_path にリダイレクトします。

do_authentication が正しく機能していないようです。通常のユーザーが「correct_user」ではなく管理者として認証されようとしています。

何が間違っている可能性がありますか?

ありがとう!

class PostsController < ApplicationController
  before_filter :signed_in_user, only: [:index, :create, :destroy]
  before_filter :do_authentication,  only: :destroy
  .
  .
  .
def destroy
  @post.destroy
  flash[:success] = "Post deleted!"
  redirect_back_or user_path(current_user)
end

private
  def do_authentication
    correct_user || admin_user
  end

  def correct_user
    @post = current_user.posts.find_by_id(params[:id])
    redirect_to user_path(current_user) if @post.nil?
  end

  def admin_user
    @post = Post.find_by_id(params[:id])
    redirect_to(root_path) unless current_user.admin?
  end
4

2 に答える 2

0

まず、認証に cancan を使用することをお勧めします。問題は correct_user の戻り値だと思います。あなたはそれを制御しません。そのメソッドが false と評価される何かを返す場合、do_authentication メソッドは admin_user も呼び出します。また、コードを見ると、管理者の承認も機能しないようです...

これを試して:

def do_authentication
  @post = Post.find_by_id(params[:id])
  redirect_to redirect_location unless current_user.admin? or @post.user == current_user
end

def redirect_location
  return "redirect_location_for_admin" if current_user.admin?
  return "redirect_location_for_non_admins"
end
于 2012-05-15T05:19:03.373 に答える
0

メソッドの呼び出し中に条件をチェックしていないため、メソッド correct_user,admin_user は、ロールに関係なくすべてのユーザーに対して実行されます。問題を解決するには、コードを改善する必要があります。

def do_authentication
  if current_user.admin?
    @post = Post.find_by_id(params[:id])
  else
    @post = current_user.posts.find_by_id(params[:id])
    redirect_to user_path(current_user), :notice => "Access denied" unless @post
  end
end
于 2012-05-15T05:36:38.233 に答える