如何将事务逻辑应用于Rails中的非数据库操作?

时间:2016-05-05 10:11:34

标签: ruby-on-rails ruby system-calls

我在视图中有一个带有输入框的表单。如果您填写输入框并按"保存",则执行系统命令并将值保留到数据库。

我检查命令是否已成功执行,然后,如果该值已更新到数据库。我不做的就是在某种交易中运行这些交易"所以更改已完成如果"system_command == true".update == true

嵌套条件可能是错误的,因为如果.update失败,系统命令已经执行,无法撤消。

  def update
    if system_command # Checks If command was executed successfully
      respond_to do |format|
        if @system_command.update(system_command_params)
          format.html { redirect_to system_commands_path, notice: 'Success' }
        else
          format.html { render :index }
        end
      end
    else
      redirect_to system_commands_path, notice: 'Failed'
    end
  end

system_command 是执行系统命令的方法。

我怎么能100%确定这种方法的完整性?

2 个答案:

答案 0 :(得分:2)

您可以在保存之前验证您的记录:

@system_command.assign_attributes(system_command_params) # Assign params, but don't save.

# `system_command` will only be run if the @system_command passes Rails validations.
if @system_command.valid? && system_command
  @system_command.save
  # ...
end

请注意,调用valid?

时不会考虑本机数据库约束

答案 1 :(得分:0)

我相信这个解决方案有效但我还不能测试它。

  def update
    ActiveRecord::Base.transaction do
      @system_command.update(system_command_params) # Update the db
      begin
        system_command # Run the command
        redirect_to system_commands_path, notice: 'Success' 
      rescue # If the command fails
        raise ActiveRecord::Rollback
        redirect_to system_settings_path, notice: 'Fail'
      end           
    end
  end