修改:最初的目标是使用WM_CLOSE
作为before_action
操作的阻止程序,对于非Admin和Current的用户。换句话说,只允许管理员或当前用户执行show
操作。根据我的经验,我了解到实现它的简单方法是阻止执行内部的执行,但这会导致代码重复。
原文:我正在尝试构建一些复杂的before_action配置:
在布尔逻辑中我可以将其配置为: Logged_in和(管理员或当前)
Logged_in / Not Logged in,Admin and Current功能已定义
show
它应该由定义的逻辑
起作用答案 0 :(得分:1)
你在这里混淆了两个截然不同的东西 - 身份验证和授权。
你真的不需要一个非常复杂的逻辑门 - 你需要为每个问题分开回调。
class ApplicationController < ActionController::Base
private
def authenticate_user!
flash[:error] = "Please sign in."
redirect_to new_session_path and return
end
end
因此,让我们设置一个非常简单的身份验证和授权示例。规则如下:
class BooksController < ApplicationController
before_action :authenticate_user!, except: [:show, :index]
before_action :set_book, except: [:new, :index]
before_action :authorize!, except: [:new, :create, :show, :index]
private
def set_book
@user = Book.find(params[:id])
end
def authorize!
unless @book.user == current_user || current_user.admin?
redirect_to users_path, alert: 'You are not authorized.' and return
end
end
end
但是,您应该首先整合和学习现有的解决方案,例如Devise,CanCanCan和Pundit。当你掌握了自己可以自己动手的时候。