0

私のプロジェクトコントローラーには、以下のアクションがあります。ご覧のとおり、「show」ビューがレンダリングされると「check_if_owner_or_member」が呼び出され、ユーザーがプロジェクトまたは管理者のメンバーであるかどうかがチェックされます。そうでない場合、ユーザーはエラー メッセージを受け取り、ルートにリダイレクトされます。

アクションを試すと、ユーザーが管理者の場合は機能しますが、ユーザーがメンバーの場合は機能しません。したがって、'if !is_owner || に何か問題があるようです。'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

メンバーは管理者ではないため、最初の部分は true になり、2 番目の部分は実行されません。ここで && を使用したいと思うでしょう。

于 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 に答える