使用||时出现问题(或)if语句

时间:2013-02-13 23:13:56

标签: ruby-on-rails ruby-on-rails-3 if-statement

在我的项目控制器中,我有以下操作。如您所见,在呈现“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

2 个答案:

答案 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?方法,其执行速度比查找,计数和比较为零更快。