Ruby Sinatra + Sequel约束错误处理

时间:2012-06-30 02:05:34

标签: ruby orm sqlite sinatra sequel

在续集中处理来自模型的异常的正确方法是什么?特别是我遇到的事情是将唯一约束应用于登录。在这种情况下的例外似乎来自SQLite本身而不是续集,这意味着它不会被“错误”处理。

这是我尝试使用“非唯一”登录创建用户后遇到的错误:

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

3 个答案:

答案 0 :(得分:1)

您可能希望使用validation_helpers插件并在validate方法中使用validates_unique :login

答案 1 :(得分:0)

添加以下代码以处理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

您可以组合使用其中的许多块,以便以不同方式处理不同类型的错误。

答案 2 :(得分:0)

首先 - 使用验证插件

# 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
...