Ruby Sinatra+;续集约束错误处理
在Sequel中,处理来自模型的异常的正确方法是什么?特别是当唯一约束应用于登录时,我遇到的问题。本例中的异常似乎来自SQLite本身,而不是Sequel,这意味着它没有被“错误”处理 这是我在尝试创建具有“非唯一”登录名的用户后遇到的错误: 以下是我的缩写代码:Ruby Sinatra+;续集约束错误处理,ruby,orm,sqlite,sinatra,sequel,Ruby,Orm,Sqlite,Sinatra,Sequel,在Sequel中,处理来自模型的异常的正确方法是什么?特别是当唯一约束应用于登录时,我遇到的问题。本例中的异常似乎来自SQLite本身,而不是Sequel,这意味着它没有被“错误”处理 这是我在尝试创建具有“非唯一”登录名的用户后遇到的错误: 以下是我的缩写代码: require 'sinatra' require 'sequel' DB.create_table :users do primary_key :id String :login, :key => true, :le
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
需要“sinatra”
需要“续集”
DB.create_表:用户做
主键:id
字符串:login,:key=>true,:length=>(3..40),:required=>true,:unique=>true
字符串:哈希密码,:required=>true
绳子:盐
DateTime:created_at,:default=>DateTime.now
结束
类用户 tmp您可能希望使用validation\u helpers插件,并在validate方法中使用validates\u unique:login
。添加以下代码以处理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
您可以组合这些块中的许多块,以便以不同的方式处理不同类型的错误。首先-使用验证插件
# models/account.rb
Sequel::Model.plugin :validation_helpers
class Account < Sequel::Model
def validate
super
validates_unique :login
end
end
# 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
...