Ruby on rails 使用| |和#xA0时出现问题;(或)在if声明中

Ruby on rails 使用| |和#xA0时出现问题;(或)在if声明中,ruby-on-rails,ruby-on-rails-3,if-statement,Ruby On Rails,Ruby On Rails 3,If Statement,在我的项目控制器中,我有以下操作。如您所见,在呈现“show”视图时,如果调用了“check\u owner\u”或“check\u member”,则会检查用户是否是项目成员或管理员。如果不是这样,用户会收到一条错误消息并被重定向到根目录 当尝试该操作时,如果用户是管理员,则该操作有效,但如果用户是成员则无效。所以,“如果”!是你的主人!是_成员,因为如果我只尝试使用“如果”!他是你的会员 我做错了什么 before_filter :check_if_owner_or_member, :onl

在我的项目控制器中,我有以下操作。如您所见,在呈现“show”视图时,如果调用了“check\u owner\u”或“check\u 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

因为成员不是管理员,所以第一部分为true,第二部分不会执行。我想您应该在这里使用&。

您应该像这样重构代码:

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?
方法执行,比查找、计数和比较零更快