在我的项目控制器中,我有以下操作。如您所见,在呈现“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
答案 0 :(得分:1)
由于成员不是管理员,第一部分将为真,第二部分将不会执行。我想你会想要使用&&这里。
答案 1 :(得分: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?
方法,其执行速度比查找,计数和比较为零更快。