2012-06-30 74 views
0

在Sequel中處理來自模型的異常的正確方法是什麼?特別是我遇到的事情是當唯一的約束被應用到登錄。在這種情況下,異常似乎來自SQLite本身,而不是Sequel,這意味着它不會被「錯誤」處理。Ruby Sinatra +續集約束錯誤處理

這是試圖建立一個用戶與「非唯一」登錄後,我發現了錯誤:

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 

回答

1

你可能想使用validation_helpers插件並在驗證方法中使用validates_unique :login

+0

啊,謝謝,我錯過了在文檔中 –

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 

您可以組合這些塊中的許多塊,以便以不同方式處理不同類型的錯誤。