簡體   English   中英

Ruby Sinatra + Sequel約束錯誤處理

[英]Ruby Sinatra + Sequel constraint error handling

處理來自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

您可能要使用validation_helpers插件,並在validate方法中使用validates_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

下一步-處理應用程序中的錯誤

# app.rb
... 
begin
  Account.create
rescue => e
  # do what you need
end
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM