Home > Enterprise >  how to send SystemExit message to server
how to send SystemExit message to server

Time:10-04

So I have a Sinatra API containing this piece of code in a model:

def self.delete(account_id)
    # using Sequel, not ActiveRecord:
    if Account[account_id][:default] == true
        abort("Impossible to delete a default account. Please first set another account to default.")
    end
    # rest of the code
end

then, in app.rb :

delete '/account/:id' do
    if Account.delete(params[:id]) == 1
        status 200
    else
        status 500
    end
end

On the client side (vuejs app), I would like the error message to be displayed. Instead, when the error produces, I get a SystemExit with the error message.

How do I send that SystemExit message to the server?

CodePudding user response:

In Ruby in general you want to break out of execution either by using return, exceptions or throw/catch. abort is rarely if ever used as it will immediately halt execution of the entire program - and prevent you from doing stuff like cleaning up or actually sending a meaningful response to the client besides whatever error page the web server will render if you just quit the job half way though.

You can easily implement this by creating your own exception class:

class AccountDeletionError < StandardError
end
def self.delete(account_id)
  # using Sequel, not ActiveRecord:
  if Account[account_id][:default] == true
    raise AccountDeletionError.new, "Impossible to delete a default account. Please first set another account to default."
  end
end
delete '/account/:id' do
  if Account.delete(params[:id]) == 1
    status 200
  end
  rescue AccountDeletionError => e
    status 409 # not 500. 
    content_type :json
    { error: e.message }.to_json
  end
end

Now that you know how to handle errors you should probally address the next possible one - when an account cannot be found.

  • Related