我正在构建用户权限,我正在尝试使用“before_action”来评估条件,如果它返回true,我希望“create”操作不被执行但是如果它返回true则可以创建记录
这将是我的before_action
before_action :permiso_create, only: [:create]
def create
@producto = Producto.new(producto_params)
respond_to do |format|
if @producto.save
format.html { redirect_to @producto, notice: 'Producto was successfully created.' }
format.json { render :show, status: :created, location: @producto }
format.js {flash.now[:notice] = 'El producto se ha creado de forma exitosa.'} #ajax
else
format.html { render :new }
format.json { render json: @producto.errors, status: :unprocessable_entity }
format.js {flash.now[:alert] = 'Error al crear el producto.'} #ajax
end
end
end
我想如果条件返回true,不创建记录或不执行动作创建,只是它显示带有“权限被拒绝”消息的闪光警报
def permiso_create
@puede_crear = current_usuario.profiles.find_by_Descripcion("products").Altas
if @puede_crear != true
end
end
我尝试使用unprocessable_entity,但它没有向我显示消息js,如下所示:
def permiso_create
@puede_crear = current_usuario.profiles.find_by_Descripcion("products").Altas
if @puede_crear != true
respond_to do |format|
format.js {flash.now[:alert] = 'you don't have permission.'} #ajax
end
head :unprocessable_entity
end
end
答案 0 :(得分:1)
我为此创建了一个名为ActionControl的gem,让您有机会直接在控制器中对用户进行身份验证和授权。
如果用户未获得授权,则会引发异常并且不会执行该操作。然后捕获此异常并以401或403状态响应用户。
如果您不想使用gem,您也可以通过在permiso_create
方法中引发异常并抓住这个来自行完成。
答案 1 :(得分:1)
您可以在验证后使用return
def permiso_create
@puede_crear = current_usuario.profiles.find_by_Descripcion("products").Altas
if @puede_crear != true
# you can return a flash message before stop the flow here
@foo = nil
return
end
end
这将停止流程
编辑:添加条件
before_action :permiso_create, only: [:create]
def create
if @foo.nil?
return
end
#continue with your code
end
答案 2 :(得分:0)
即使您的情况不符合,您仍应该格式化响应。这应该做:
def permiso_create
@puede_crear = current_usuario.profiles.find_by_Descripcion("products").Altas
unless @puede_crear
respond_to do |format|
format.js {flash.now[:alert] = "you don't have permission.", status: :unprocessable_entity}
end
end
end