0

在我的项目控制器中,我有以下操作。如您所见,在呈现“show”视图时调用了“check_if_owner_or_member”,它检查用户是否是项目成员或管理员。如果不是这种情况,用户会收到一条错误消息并被重定向到根目录。

在尝试该操作时,如果用户是管理员,它会起作用,但如果用户是成员,则不会。所以,'if !is_owner || 显然有问题 !is_member',因为如果我只尝试使用 'if !is_member',它就可以工作。

我究竟做错了什么?

before_filter :check_if_owner_or_member, :only => [:show]

def is_owner
    Project.where("id = ? AND user_id = ?", params[:id], current_user.id).count > 0
end

def is_member
    ProjectsUser.where("project_id = ? AND user_id = ?", params[:id], current_user.id).count > 0
end

def check_if_owner_or_member
    if !is_owner || !is_member
        redirect_to root_path
        flash[:error] = "You don't have permission to the project!"
    end
end
4

2 回答 2

1

由于成员不是管理员,因此第一部分为真,第二部分不会执行。我想你会想在这里使用 && 。

于 2013-02-13T23:17:53.263 回答
1

您应该像这样重构您的代码:

before_filter :check_if_owner_or_member, :only => [:show]

def is_owner?
  Project.exists?(id: params[:id], user_id: current_user.id)
end

def is_member?
  ProjectsUser.exists?(project_id: params[:id], user_id: current_user.id)
end

def check_if_owner_or_member
  unless is_owner? || is_member? # as TheDude said, you probably meant && here
    redirect_to root_path
    flash[:error] = "You don't have permission to the project!"
  end
end

它更具可读性,并且使用exists?比查找、计数和比较零更快的方法执行。

于 2013-02-13T23:18:56.017 回答