Обработка ошибок ограничения Ruby Sinatra + Sequel

Как правильно обрабатывать исключения из модели в Sequel? В частности, я сталкиваюсь с тем, что уникальное ограничение применяется к логину. Исключение в этом случае, по-видимому, исходит от самого SQLite, а не от Sequel, что означает, что оно не обрабатывается «ошибками».

Это ошибка, которую я получаю после попытки создать пользователя с «неуникальным» логином:

Sequel::DatabaseError at /user/create
SQLite3::ConstraintException: column login is not unique
file: database.rb location: close line: 97

Вот мой сокращенный код:

require 'sinatra'
require 'sequel'

DB.create_table :users do
  primary_key :id
  String :login, :key => true, :length => (3..40), :required => true, :unique => true
  String :hashed_password, :required => true
  String :salt
  DateTime :created_at, :default => DateTime.now
end

class User < Sequel::Model
  # password authentication code
end

get '/user/create' do
  slim :user_create
end

post '/user/create' do
  user = User.new
  user.login = params['login']
  user.password = params['password']
  if user.save
    'User created'
  else
    tmp = []
    user.errors.each do |e|
      tmp << (e.join('<br/>'))
    end
    tmp
  end
end

person Josh Voigts    schedule 30.06.2012    source источник


Ответы (3)


Вы, вероятно, захотите использовать плагин validation_helpers и использовать validates_unique :login внутри метода проверки.

person Jeremy Evans    schedule 30.06.2012

Добавьте приведенный ниже код для обработки ошибок сиквела в Sinatra.

Блок ошибок в Sinatra будет обрабатывать любые ошибки, возникающие в одном из ваших маршрутов. Вы можете указать тип ошибки в первой строке, чтобы обрабатывать только эти типы ошибок.

error Sequel::Error do
  e = env['sinatra.error']
  content_type :json
  status(400)
  return {
    message: e.message
  }.to_json
end

Если вы хотите обработать все ошибки, вы должны вставить следующий блок кода.

error Exception do
  e = env['sinatra.error']
  content_type :json
  status(400)
  return {
    message: e.message
  }.to_json
end

Вы можете комбинировать многие из этих блоков, чтобы по-разному обрабатывать разные типы ошибок.

person cyrus    schedule 04.08.2015

Во-первых, используйте плагин проверки

# models/account.rb
Sequel::Model.plugin :validation_helpers

class Account < Sequel::Model
  def validate
    super
     validates_unique :login
  end
end

Далее - обработать ошибку в приложении

# app.rb
... 
begin
  Account.create
rescue => e
  # do what you need
end
...
person Purkhalo Alex    schedule 14.04.2018