避免使用before_action进行处理

时间:2017-09-21 20:47:26

标签: ruby-on-rails ruby ruby-on-rails-4

我正在构建用户权限,我正在尝试使用“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

3 个答案:

答案 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