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 进行授权。我认为您的问题是正确用户的返回值。你控制不了那个。如果该方法返回的结果为 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 回答