Ruby on rails 避免在采取行动前进行处理
我正在构建用户权限,并尝试使用“before_action”评估条件,如果它返回true,我希望不执行“create”操作,但如果它返回true,则可以创建记录 那将是我的行动之前Ruby on rails 避免在采取行动前进行处理,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我正在构建用户权限,并尝试使用“before_action”评估条件,如果它返回true,我希望不执行“create”操作,但如果它返回true,则可以创建记录 那将是我的行动之前 before_action :permiso_create, only: [:create] def create @producto = Producto.new(producto_params) respond_to do |format| if @producto.save for
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,不要创建记录或执行创建操作,只显示带有“权限被拒绝”消息的flash警报
我尝试使用不可处理的_实体,但它没有显示消息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
我已经为此创建了一个名为gem的程序,它使您有机会直接对控制器中的用户进行身份验证和授权 如果用户未经授权,则会引发异常,并且不会执行该操作。然后捕获此异常并以401或403状态响应用户
如果您不想使用gem,您也可以通过在
permiso\u create
方法中引发异常并捕获此异常来完成此操作。我已为此调用创建了一个gem,它使您有机会直接对控制器中的用户进行身份验证和授权
如果用户未经授权,则会引发异常,并且不会执行该操作。然后捕获此异常并以401或403状态响应用户
如果您不想使用gem,您也可以通过在
permiso\u create
方法中引发异常并捕获此异常来完成此操作。您可以在验证后使用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
您可以在验证后使用
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
即使您的条件不满足,您仍然可能需要格式化响应。这应该做到:
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
即使您的条件不满足,您仍然可能需要格式化响应。这应该做到:
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
是的,它会停止流,但在“permiso_create”方法内,并且不会停止该方法create@luis31您可以在使用before_action I Edit my Answer时返回一个变量并添加一个条件。此外,您还可以找到更多信息,这样它就不会继续执行“permiso_create”方法的条件。问题是只使用返回只会停止“permiso_create”方法的流并执行createmethod@luis31我明白你的意思,然后你可以在你创建的方法中验证变量的存在,我编辑了我的回答是的,它停止了流程,但在方法“permiso_create”中,不要停止这种方法create@luis31您可以在使用before_action I Edit my Answer时返回一个变量并添加一个条件。此外,您还可以找到更多信息,这样它就不会继续执行“permiso_create”方法的条件。问题是只使用返回只会停止“permiso_create”方法的流并执行createmethod@luis31我明白你的意思,然后你可以验证你创建的方法中变量的存在,我编辑了我的答案,它停止了循环,但问题是我以前试图通过js发送消息,但它没有显示在屏幕上,我用我发送消息的方式更新了帖子,并使用了不可处理的实体。我得到了这个错误:SyntaxError(/home/luis/sites/adcv2/app/controllers/productos_controller.rb:198:语法错误,意外的tLABEL…没有权限。“,状态::无法处理的_entity}…^):app/controllers/productos_controller.rb:198:语法错误,意外的tLABELit工作,它停止了循环,但问题是我以前试图通过js发送消息,但它没有显示在屏幕上,我用我发送不可处理的_实体的方式更新了帖子我得到了这个错误:SyntaxError(/home/luis/sites/adcv2/app/controllers/productos_controller.rb:198:语法错误,意外的tLABEL…在没有权限的情况下。”,status::unprocessable_entity}…^):app/controllers/productos_controller.rb:198:语法错误,意外的tLABEL